什么是MySQL死锁?如何避免死锁?
死锁:死锁是指两个或者多个事务在同一资源上相互占用, 并请求锁定对方占用的资源, 从而导致恶性循环的现象。
争抢资源、互相等待, 是一种多线程因为争抢资源而出现的互相等待的状态。
产生死锁的原因:
当多个事务试图以不同顺序锁定资源时, 就可能产生死锁。
多个事务同时锁定同一个资源时, 也会产生死锁。
如何有效降低死锁:
以固定的顺序访问表和行。即按顺序申请锁,这样就不会造成互相等待的场面。
大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小。
在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率。
降低隔离级别。如果业务允许,将隔离级别调低也是较好的选择,比如将隔离级别从REPEATABLE READ(可重复读)调整为READ COMMITTED(提交读),可以避免掉很多因为gap锁造成的死锁。
为表添加合理的索引。如果不走索引将会为表的每一行记录添加上锁,死锁的概率大大增大。
Last updated
Was this helpful?