乐观锁,悲观锁, Innodb行锁,读锁,写锁 混乱了
最近在看有关锁的知识, 见到的名词那叫一个多啊, 完全懵逼了
1.乐观锁,悲观锁, Innodb行锁,读锁(共享锁),写锁(排他锁),意向共享/排他锁, 间隙锁, 更新锁 这些词太混乱了, 有没有资料理的比较清楚 到底之间都什么关系
2.乐观锁 : 网上的实现方案大部分都是说加一个 version 字段, 或者timestamp字段; 然后又找到一份如下方案,"在更新时候带入原始数据", 具体如下:
比方说,要把一个字段status从 yes 变为 no,
update table set `status`=`no` where status='yes'
这三种方案, 最后一种也是乐观锁么? 最后一种在Innodb存储引擎下,innodb对更新语句不是会自动加排他锁么?这个排他锁应该是数据库的真正锁吧,怎么能是乐观锁? 况且很多资料都说排他锁就是悲观锁!
参考的资料如下:
http://www.jianshu.com/p/a40f...
http://www.itpub.net/thread-1...
http://blog.csdn.net/u0109564...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
1、问题1
Innodb行锁的模式:共享锁(又叫读锁,S锁)、排他锁(又叫写锁、X锁)
Innodb行锁的类型:Record Lock(行记录锁)、Gap Lock、Next-key Lock(Next-key Lock=Record Lock+Gap Lock,可以参考https://my.oschina.net/hebaod... lock)
意向锁:属于表锁。
意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁
IS、S、IX、X锁的兼容性为:
乐观锁与悲观锁是一种用于并发控制的手段,这就不仅仅限于数据库的层面锁了,悲观锁利用排他锁实现,不允许其他人并发修改。具体概念可自行Google
2、问题2
举例中update是一种乐观锁,乐观锁的一种实现就是版本控制,status可以认为就是版本,符合某个版本我就更新它。
没必要搞那么复杂,你可以这么理解:
1、写锁是排它
2、读锁是共享
3、意向锁也是排他
4、悲观锁也是常说的排他
5、乐观锁是逻辑层的版本控制,在悲观锁的基础上进行的,带条件更新就是按照版本更新,有记录的话就转为自带的悲观锁,没记录就不会锁嘛
总的来说就是确认你是否选中了记录,选中了记录是不是要更新,要更新就加排它锁,不更新就共享好了嘛
首先说乐观锁和悲观锁,是应用设计时选择的并发访问策略,和具体的数据库实现技术无关,这一点在你提到的itpub的帖子说的已经比较清楚了。
其他的innodb相关的锁,是mysql内部对并发访问的控制机制,具体深入的彦军可以参考这个资料:
MySQL 加锁处理分析