作者回复: 是个好问题
如果他要加锁访问的行上有锁,他才要检测。
这里面我担心你有两个误解,说明下:
1. 一致性读不会加锁,就不需要做死锁检测;
2. 并不是每次死锁检测都都要扫所有事务。比如某个时刻,事务等待状态是这样的:
B在等A,
D在等C,
现在来了一个E,发现E需要等D,那么E就判断跟D、C是否会形成死锁,这个检测不用管B和A
作者回复: 第一个问题是好问题,我加到答疑文章中。简单的回答:是的。但是你可以再往前考虑一下,如果是 你的update 语句后面加个limit 1, 会怎么锁?
Innodb支持行锁,没有支持“列锁” 哈😄
作者回复: 不矛盾,MDL锁和表锁是两个不同的结构。
比如:
你要在myisam 表上更新一行,那么会加MDL读锁和表的写锁;
然后同时另外一个线程要更新这个表上另外一行,也要加MDL读锁和表写锁。
第二个线程的*MDL读锁是能成功加上*的,但是被表写锁堵住了。从语句现象上看,就是第二个线程要等第一个线程执行完成。
作者回复: 不是“以粒度最小为准”
而是如果有多种锁,必须得“全部不互斥”才能并行,只要有一个互斥,就得等。
好问题
作者回复: 好问题
理论上说,之前没死锁,现在A加进来,出现了死锁,那么死锁的环里面肯定包含A,
因此只要从A出发去扫就好了
作者回复: 1. 就是持续监控,发现新的就存起来
2. 不会,reset_connection只是复位状态,恢复到连接和权限验证之后的状态,没有重连
作者回复: 这个你得同时贴表结构。
还有,会不会锁,不是验证一下就可以吗,两个都用begin + 语句,
两阶段锁协议会帮助你😄
作者回复: 分析得很好。
嗯嗯索引和锁的内容很多,也是需要慢慢安排😄
突然上概念怕大家看得不开心😓
作者回复: 继续手动👍🏿
作者回复: 👍🏿这个总结
作者回复: 感谢鼓励🤝
作者回复: 逐行加锁,
事务提交的时候统一释放。— 记得两阶段锁哈
作者回复: 1. show engine innodb status 里面有信息,不过不是很全…
2. 5.7的reset_connection接口可以考虑一下
3. 用redis的话,为了避免超卖需要增加了很多机制来保证。修改都在数据库里执行就方便点。前提是要解决热点问题
4. 我认识几位处理问题和分析问题经验非常丰富的专家,不用懂源码,但是原理还是要很清楚的
作者回复: 是个好的实践经验👍🏿
作者回复: 手动点赞
作者回复: 对的