mysql 死锁

140 阅读1分钟

mysql死锁测试和解决

死锁测试

死锁,当两个事务需要一组有冲突的锁,而不能将事务继续下次的话,就会产生死锁。
命令行窗口一:

BEGIN;                          //第一步,开启事务1
UPDATE ty SET b =1 WHERE a = 2; //第三步,锁定 a = 2 的记录
UPDATE ty SET b =1 WHERE a = 3; //第五步,卡主,等待事务2上 a = 3 的锁
COMMIT;            

命令行窗口二:

BEGIN;                          //第二步,开启事务2
UPDATE ty SET b =1 WHERE a = 3; //第四步,锁定 a = 3 的记录
UPDATE ty SET b =1 WHERE a = 2; //第六步,等待事务1上 a = 2 的锁,事务1和事务2互相等待对方的锁,此时出现死锁,mysql 会回退当前事务
COMMIT;     

解决方法:

是由于程序的BUG产生的,除了调整的程序的逻辑没有其它的办法。仔细分析程序的逻辑,对于数据库的多行操作时,尽量按照相同的顺序进行处理,尽量避免同时锁定两个资源,如操作A和B两行时,总是按先A后B的顺序处理, 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源