寫一個Mysql死鎖的例子

建立表.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 

相關文章
相關標籤/搜索