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

乐观锁适用用冲突不多的场景,只有在最后更新的时候才去看是否冲突。所以如果冲突很多的话,数据争用激烈,会导致不断尝试,反而会降低性能。

所以,一般来说如果并发量很高的话,建议使用悲观锁,否则的话就使用乐观锁。如果并发量很高时使用乐观锁的话,会导致很多的并发事务回滚、操作失败。(http://bbs.csdn.net/topics/340001655)

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

参考公众号:码农翻身

最新文章

  1. ArchLinux+Win10双系统的Grub配置
  2. c# 生成SHA1加密字符串
  3. ios10新特性-UserNotification
  4. 【bzoj3674】 可持久化并查集加强版
  5. 同一机器 部署 两个 jboss
  6. NSRect
  7. Memcached Java Client with sample program--reference
  8. LINQ TO SQL ——Group by
  9. HBase集群安装
  10. 利用moment为基础,基于DOM实现一个多个倒计时同时进行的js库方便使用
  11. poj2739尺取法+素数筛
  12. Django子应用里的通用类混合视图处理
  13. Windows下搭建Redis集群
  14. hadoop2-HBase的安装和测试
  15. 为ivew的Page组件的跳页增加跳页确定按钮
  16. form表单js提交
  17. Codeforces Round #538 (Div. 2)
  18. dirty_background_ration 与 /proc/sys/vm/dirty_ratio
  19. JS中数据类型的判断
  20. linux 升级python2.7

热门文章

  1. 【刷题】BZOJ 3546 [ONTAK2010]Life of the Party
  2. [ZJOJ2007]时态同步 贪心
  3. BZOJ2115:[WC2011]Xor——题解
  4. 拼接sql语句参数绑定
  5. HDU3068:最长回文(Manacher模板)
  6. JQuery学习二(获取元素控件并控制)
  7. 跨域共享cookie和跨域共享session
  8. 游戏编程入门之Bomb Catcher游戏
  9. Robotframework Web自动化实战课程
  10. 如何在sublime中使用sftp