mysql死锁的原因和处理方法是什么

文 / @WordPress主题

MySQL死锁的原因和处理方法

当多个事务同时持有和请求同一资源上的锁而产生循环依赖的时候就产生了死锁。死锁发生在事务试图以不同的顺序锁定资源。死锁是事务系统中客观存在的事实,设计上必须考虑处理死锁。

以下是一些处理死锁的方法:

1. 减少死锁发生的可能性

可使用以下技术减少死锁的可能性:

- 将表和行以固定的顺序访问,使得事务形成明确定义的查询并且没有死锁;
- 给表添加精心选定的索引,这样查询需要扫描更少的索引记录并且因此设置更少的锁定;
- 使用最适当的索引:使用EXPLAIN SELECT来确定对于查询,MySQL认为哪个索引是最适当的;
- 使用更少的锁定:如果可以接受允许一个SELECT从一个旧的快照返回数据,则不要给它添加FOR UPDATE或LOCK IN SHARE MODE子句;
- 使用辅助的“semaphore”表将每个事务以序列的方式发生。

2. 锁定级别和超时机制

在MySQL中,支持4种锁定级别以及2种超时机制:

- 锁定级别:DEFAULT、READ COMMITTED、REPEATABLE READ、SERIALIZABLE;
- 超时机制:等待超时后放弃、回滚持有最少排他行级锁的事务。

当前InnoDB处理死锁的方式是回滚持有最少排他行级锁的事务,即排他锁死优先级低的事务。

3. 调试死锁

使用SHOW ENGINE INNODB STATUS命令查看当前死锁的情况,根据错误提示及时调整应用程序来避免死锁。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。