创建表
CREATE TABLE `test1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
终端1
--T1时刻BEGIN;--行级锁 id=1 的记录select * from test1 where id=1 for update ;--T3时刻--更新 id=2 的记录update test1 set id=id where id=2;
终端2
--T2时刻BEGIN;--行级锁 id=2 的记录select * from test1 where id=2 for update ;--T4时刻--更新 id=1 的记录update test1 set id=id where id=1;
运行结果
update test1 set id=id where id=1> 1213 - Deadlock found when trying to get lock; try restarting transaction> 时间: 0.002s
分析
终端一在T1时刻 test1 表的id=1的记录加了排它锁
终端二在T2时刻 test1 表的id=2的记录加了排它锁
终端一在T3时刻要去更新test1表中id=2的记录,此时该行记录已经加了排它锁,无法进行更新操作,需要等待锁释放
终端二在T4时刻要去更新test1表中id=1的记录,此时该行记录已经加了排它锁,无法进行更新操作,需要等待锁释放
.....
这两个事务相互等待对方的排它锁释放,如此出现了死锁
如果不明白,参考我的文章