mysql事务串行化的锁机制是怎样的

发布于 2022-09-07 08:03:10 字数 503 浏览 26 评论 0

mysql事务 串行化 隔离级别的锁机制是怎样的
在A、B客户端都开启事务,假如
① 如果A事务删除某条记录(尚未提交回滚),B事务无法读取A事务中删除且未提交的事务,这是因为A事务中加了写锁
② 如果A事务插入了一条数据(假如ID为4),那么B事务中,ID = 1、2、3都可以正常读,但是
select * from account where id <= 3;
就会等待,不太理解,望不吝赐教、谢谢诸位

参考资料:
① MySQL高性能中提到:串行化会在读取的每一行数据上都加锁(这个意思是部分锁,但不会锁表)
https://tech.meituan.com/inno...
这里提到:串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
这意思是锁表了,到底是锁表还是锁某些记录
③ 共享锁为什么还会相互阻塞

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(2

扎心 2022-09-14 08:03:10

隔离机制比较复杂,而且不同的数据库还不一致,你的问题是基于MySQL的Innodb,我的理解是这样的:
Serializable隔离在每次访问记录的时候(无论读写),都会锁记录,所以导致了你说的问题,虽然你加了条件id<=3,但还是需要遍历到每条记录,才能给出select结果,所以依然会被锁。

实际项目中,这个级别的隔离很少用(我从来没在实际项目中用过)。因为并发性能低,容易死锁,最常用的还是缺省的REPEATABLE READ或是READ COMMITTED。

难以启齿的温柔 2022-09-14 08:03:10

②:innodb下,串行化的读并不会锁表,而是根据where条件锁一个范围。
但锁一个范围并不是简单锁记录,因为涉及到Next-key lock。
③:因为插入id=4的记录时,id=4记录不存在,所以会使用gap锁锁住id在3和下一条记录之间的间隙。
select * from account where id <= 3是范围查询,由于Next-key lock机制的存在,不是锁(负无穷,3],而是锁(负无穷,3]+右gap,此时gap锁冲突。

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