如何尽可能避免死锁?
1) 以固定的顺序访问表和行。比如两个更新数据的事务,事务A 更新数据的顺序 为1,2;事务B更新数据的顺序为2,1。这样更可能会造成死锁。
2) 大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小。
3) 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率。
4) 降低隔离级别。如果业务允许,将隔离级别调低也是较好的选择,比如将隔离级别从RR调整为RC,可以避免掉很多因为gap锁造成的死锁。(我司mysql规范做法)
5) 为表添加合理的索引。可以看到如果不走索引将会为表的每一行记录添加上锁,死锁的概率大大增大。
MVCC 多版本并发控制(读不加锁,读写不冲突)
InnoDB:
通过为每一行记录添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期(或者被删除)。但是InnoDB并不存储这些事件发生时的实际时间,相反它只存储这些事件发生时的系统版本号。这是一个随着事务的创建而不断增长的数字。每个事务在事务开始时会记录它自己的系统版本号。每个查询必须去检查每行数据的版本号与事务的版本号是否相同。让我们来看看当隔离级别是REPEATABLE READ时这种策略是如何应用到特定的操作的

本文深入探讨了如何在数据库操作中避免死锁的发生,包括固定顺序访问、拆分大事务、一次性锁定所有资源、调整隔离级别以及合理使用索引等策略。同时,解析了InnoDB的MVCC多版本并发控制机制,揭示其如何通过记录行数据的版本号来解决读写冲突。
8835

被折叠的 条评论
为什么被折叠?



