|
5 | 5 |
|
6 | 6 | <title>开发中遇到的数据库更新丢失问题 | Hexo</title>
|
7 | 7 | <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
8 |
| - <meta name="description" content="前提:什么是数据库更新丢失?举个栗子,假设有如下情况,假设,嗯~ o( ̄▽ ̄)o: 1、小A查询了数据库 2、小B也查询了数据库,两个人不在同一个session中 3、小A修改了数据库中的一行,并提交 4、小B也修改了数据库的一行,但提交晚于小A 这个时候,小B的修改会覆盖小A的修改,就发生了数据库更新丢失的问题 我所知道的解决方案: 1、悲观锁 通过采用sel"> |
| 8 | + <meta name="description" content="我自己测试的时候发现有更新丢失的现象,还是第一次发现这个问题,研究了一下前提:什么是数据库更新丢失?举个栗子,假设有如下情况: 1、小A查询了数据库 2、小B也查询了数据库,两个人不在同一个session中 3、小A修改了数据库中的一行,并提交 4、小B也修改了数据库的一行,但提交晚于小A 这个时候,小B的修改会覆盖小A的修改,就发生了数据库更新丢失的问题 解决方案:"> |
9 | 9 | <meta property="og:type" content="article">
|
10 | 10 | <meta property="og:title" content="开发中遇到的数据库更新丢失问题">
|
11 | 11 | <meta property="og:url" content="http://yoursite.com/2017/09/17/开发中遇到的数据库更新丢失问题/index.html">
|
12 | 12 | <meta property="og:site_name" content="Hexo">
|
13 |
| -<meta property="og:description" content="前提:什么是数据库更新丢失?举个栗子,假设有如下情况,假设,嗯~ o( ̄▽ ̄)o: 1、小A查询了数据库 2、小B也查询了数据库,两个人不在同一个session中 3、小A修改了数据库中的一行,并提交 4、小B也修改了数据库的一行,但提交晚于小A 这个时候,小B的修改会覆盖小A的修改,就发生了数据库更新丢失的问题 我所知道的解决方案: 1、悲观锁 通过采用sel"> |
14 |
| -<meta property="og:updated_time" content="2017-09-17T15:27:03.936Z"> |
| 13 | +<meta property="og:description" content="我自己测试的时候发现有更新丢失的现象,还是第一次发现这个问题,研究了一下前提:什么是数据库更新丢失?举个栗子,假设有如下情况: 1、小A查询了数据库 2、小B也查询了数据库,两个人不在同一个session中 3、小A修改了数据库中的一行,并提交 4、小B也修改了数据库的一行,但提交晚于小A 这个时候,小B的修改会覆盖小A的修改,就发生了数据库更新丢失的问题 解决方案:"> |
| 14 | +<meta property="og:image" content="http://yoursite.com/2017/09/17/开发中遇到的数据库更新丢失问题/success.png"> |
| 15 | +<meta property="og:image" content="http://yoursite.com/2017/09/17/开发中遇到的数据库更新丢失问题/errorupdate.png"> |
| 16 | +<meta property="og:image" content="http://yoursite.com/2017/09/17/开发中遇到的数据库更新丢失问题/updateoptm.png"> |
| 17 | +<meta property="og:updated_time" content="2017-09-18T05:15:45.392Z"> |
15 | 18 | <meta name="twitter:card" content="summary">
|
16 | 19 | <meta name="twitter:title" content="开发中遇到的数据库更新丢失问题">
|
17 |
| -<meta name="twitter:description" content="前提:什么是数据库更新丢失?举个栗子,假设有如下情况,假设,嗯~ o( ̄▽ ̄)o: 1、小A查询了数据库 2、小B也查询了数据库,两个人不在同一个session中 3、小A修改了数据库中的一行,并提交 4、小B也修改了数据库的一行,但提交晚于小A 这个时候,小B的修改会覆盖小A的修改,就发生了数据库更新丢失的问题 我所知道的解决方案: 1、悲观锁 通过采用sel"> |
| 20 | +<meta name="twitter:description" content="我自己测试的时候发现有更新丢失的现象,还是第一次发现这个问题,研究了一下前提:什么是数据库更新丢失?举个栗子,假设有如下情况: 1、小A查询了数据库 2、小B也查询了数据库,两个人不在同一个session中 3、小A修改了数据库中的一行,并提交 4、小B也修改了数据库的一行,但提交晚于小A 这个时候,小B的修改会覆盖小A的修改,就发生了数据库更新丢失的问题 解决方案:"> |
| 21 | +<meta name="twitter:image" content="http://yoursite.com/2017/09/17/开发中遇到的数据库更新丢失问题/success.png"> |
18 | 22 |
|
19 | 23 | <link rel="alternate" href="/atom.xml" title="Hexo" type="application/atom+xml">
|
20 | 24 |
|
@@ -85,13 +89,13 @@ <h1 class="article-title" itemprop="name">
|
85 | 89 |
|
86 | 90 | <div class="article-entry" itemprop="articleBody">
|
87 | 91 |
|
88 |
| - <p>前提:什么是数据库更新丢失?<br><br>举个栗子,假设有如下情况,假设,嗯~ o(<em> ̄▽ ̄</em>)o:<br><br> 1、小A查询了数据库<br><br> 2、小B也查询了数据库,两个人不在同一个session中<br><br> 3、小A修改了数据库中的一行,并提交<br><br> 4、小B也修改了数据库的一行,但提交晚于小A<br><br> 这个时候,小B的修改会覆盖小A的修改,就发生了数据库更新丢失的问题<br></p> |
89 |
| -<p> 我所知道的解决方案:<br><br> 1、悲观锁<br><br> 通过采用select for update或者select for update nowait,<br><br> 2、乐观锁</p> |
| 92 | + <p>我自己测试的时候发现有更新丢失的现象,还是第一次发现这个问题,研究了一下<br><br>前提:什么是数据库更新丢失?<br><br>举个栗子,假设有如下情况:<br><br> 1、小A查询了数据库<br><br> 2、小B也查询了数据库,两个人不在同一个session中<br><br> 3、小A修改了数据库中的一行,并提交<br><br> 4、小B也修改了数据库的一行,但提交晚于小A<br><br> 这个时候,小B的修改会覆盖小A的修改,就发生了数据库更新丢失的问题<br></p> |
| 93 | +<p> 解决方案:<br><br> 1、悲观锁<br><br> 通过采用select for update或者select for update nowait,<br><br> 逻辑是:<br><br> 小A先查<br> <br><br> <img src="success.png" alt=""><br> 小B后查<br> <img src="errorupdate.png" alt=" "><br> 小B的查询会锁住,在页面的表现应该就是阻塞,什么数据也没有。<br><br><br> 2、乐观锁<br><br> 采用在数据库中表中加版本号和时间戳的形式进行加锁,项目中采用的是时间戳的形式,因为个别表中有这个字段:op_tm–操作时间。<br><br> 逻辑是:<br><br> 在update的时候,比较旧的时间戳,因为所有更新都会更新时间戳,那么最后一次更新也就是步骤四中的时间戳还是旧的时间戳,但已经被步骤三的替代了,所以步骤四的更新会失败。步骤三的更新得以保存,步骤四的“丢失”。步骤四的“丢失”算不算更新丢失,不算,因为是建立在错误数据的更新。<br><br> <img src="updateoptm.png" alt=" "></p> |
90 | 94 |
|
91 | 95 |
|
92 | 96 | </div>
|
93 | 97 | <footer class="article-footer">
|
94 |
| - <a data-url="http://yoursite.com/2017/09/17/开发中遇到的数据库更新丢失问题/" data-id="cj7pi5c5m0004bwvvnxxds7az" class="article-share-link">Delen</a> |
| 98 | + <a data-url="http://yoursite.com/2017/09/17/开发中遇到的数据库更新丢失问题/" data-id="cj7ppwhay0003i8vvvt58n32h" class="article-share-link">Delen</a> |
95 | 99 |
|
96 | 100 |
|
97 | 101 | </footer>
|
|
0 commit comments