建立表.net
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
終端1rest
--T1時刻 BEGIN; --行級鎖 id=1 的記錄 select * from test1 where id=1 for update ; --T3時刻 --更新 id=2 的記錄 update test1 set id=id where id=2;
終端2code
--T2時刻 BEGIN; --行級鎖 id=2 的記錄 select * from test1 where id=2 for update ; --T4時刻 --更新 id=1 的記錄 update test1 set id=id where id=1;
運行結果blog
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的記錄加了排它鎖get
終端二在T2時刻 test1 表的id=2的記錄加了排它鎖io
終端一在T3時刻要去更新test1表中id=2的記錄,此時該行記錄已經加了排它鎖,沒法進行更新操做,須要等待鎖釋放test
終端二在T4時刻要去更新test1表中id=1的記錄,此時該行記錄已經加了排它鎖,沒法進行更新操做,須要等待鎖釋放date
.....select
這兩個事務相互等待對方的排它鎖釋放,如此出現了死鎖
若是不明白,參考個人文章 http://www.javashuo.com/article/p-tlnzbtcr-hm.html