死锁需要满足四个条件
1.互斥
2.持有并等待
3.不可剥夺
4.环形
通常只需要打破其中任意一个就可以解决死锁的问题,通常可以打破第四条,例如资源有序分配的规则。
下面举一个mysql官方文档的死锁例子。
有两个客户端ClientA和ClientB
1.ClientA执行以下sql(持有s锁)
START TRANSACTION;
SELECT * FROM people WHERE id = 4 LOCK IN SHARE MODE;
2.ClientB执行以下sql(尝试获取X锁)
START TRANSACTION;
DELETE FROM people WHERE id = 4;
3.ClientA执行以下sql(尝试获取X锁)
DELETE FROM people WHERE id = 4;
这个时候就会发现死锁,clientB由于ClientA已经持有s锁,所以需要等待ClientA释放s锁,才能获取x锁,而ClientA由于ClientB在等待获取x锁,所以也在等待获取x锁,这样mysql会先将
事务B停止,因为检测出deadlock,让B释放锁。