乐观锁,悲观锁, Innodb行锁,读锁,写锁 混乱了

发布于 2022-09-05 19:26:20 字数 788 浏览 17 评论 0

最近在看有关锁的知识, 见到的名词那叫一个多啊, 完全懵逼了

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梅窗月明清似水 2022-09-12 19:26:20

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锁的兼容性为:

clipboard.png

乐观锁与悲观锁是一种用于并发控制的手段,这就不仅仅限于数据库的层面锁了,悲观锁利用排他锁实现,不允许其他人并发修改。具体概念可自行Google

2、问题2

举例中update是一种乐观锁,乐观锁的一种实现就是版本控制,status可以认为就是版本,符合某个版本我就更新它。

淡淡の花香 2022-09-12 19:26:20

没必要搞那么复杂,你可以这么理解:
1、写锁是排它
2、读锁是共享
3、意向锁也是排他
4、悲观锁也是常说的排他
5、乐观锁是逻辑层的版本控制,在悲观锁的基础上进行的,带条件更新就是按照版本更新,有记录的话就转为自带的悲观锁,没记录就不会锁嘛
总的来说就是确认你是否选中了记录,选中了记录是不是要更新,要更新就加排它锁,不更新就共享好了嘛

っ〆星空下的拥抱 2022-09-12 19:26:20

首先说乐观锁和悲观锁,是应用设计时选择的并发访问策略,和具体的数据库实现技术无关,这一点在你提到的itpub的帖子说的已经比较清楚了。

其他的innodb相关的锁,是mysql内部对并发访问的控制机制,具体深入的彦军可以参考这个资料:
MySQL 加锁处理分析

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文