码迷,mamicode.com
首页 > 数据库 > 详细

MySQL乐观锁

时间:2017-11-05 16:34:36      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:查询   更新   时间戳   bsp   说明   null   sql   name   from   

  MySQL悲观锁是依靠数据库的锁机制来实现,以实现最大程度上的独占性。但由于现代的web系统一般都是高并发的,所以悲观锁在这样的情况下的适用性不高,所以我们有了和悲观锁相对应的乐观锁。

  乐观锁,是说在数据进行提交更新的时候,会对数据的冲突与否进行检测,如果发生冲突了,则返回错误的信息,让用户决定如何去做。

  乐观锁的实现一般是在程序中来控制的。常规的实现一般有两种:使用数据版本(version),使用时间戳来实现。

实现详情:

1. 在表里添加一个字段version或者时间戳字段;

2. 在查询的时候,将该字段返回,更新的时候,先校验version字段或时间戳字段是否和表里的字段一致,如果一致就更新,并且把version字段加1(时间戳的话更新为当前时间),如果不一致就说明该字段已经被更新过,提示更新失败,然后把错误信息返回给用户;

 通过一些伪代码来实现:

-- 伪代码:
-- 1. 并发查询,都查询id=1的记录
mysql> SELECT * FROM test_order WHERE id = 1;
+----+--------+------+----------+---------+-------------+
| id | status | name | goods_id | version | update_date |
+----+--------+------+----------+---------+-------------+
|  1 |      1 | 茅台 | 123      |       1 | NULL        |
+----+--------+------+----------+---------+-------------+
1 row in set

-- 2. 用户1执行更新操作
UPDATE test_order 
SET status=1, version=version+1 
WHERE id=1 and version=1 

-- 3. 此时version是2,用户2再次执行更新操作,但此时就更新不成功了
UPDATE test_order 
SET status=1, version=version+1 
WHERE id=1 and version=1

 

常用的SVN便是通过这种类似的方式来实现的。

MySQL乐观锁

标签:查询   更新   时间戳   bsp   说明   null   sql   name   from   

原文地址:http://www.cnblogs.com/xiaozhang2014/p/7787665.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!