簡單模擬死鎖

space6212發表於2019-06-25

近來程式設計師用java多執行緒匯入資料經常遇到死鎖,下面簡單模擬死鎖的成因


update
SES1: update t set a=1 where id=1;
SES2: update t set a=2 where id=2;
SES1: update t set a=2 where id=2;(掛住,等待SES2提交或者回滾)
SES2: update t set a=1 where id=1;(掛住,等待SES1提交或者回滾,此時SES1和SES2互相等待,形成死鎖)

delete
SES1: delete from t where id=1;
SES2: delete from t where id=2;
SES1: delete from t where id=2;(掛住,等待SES2提交或者回滾)
SES2: delete from t where id=1;(掛住,等待SES1提交或者回滾,此時SES1和SES2互相等待,形成死鎖)

insert(insert引起死鎖一般是因為某些約束引起的,我們假設在t的id列有唯一性約束)
SES1: insert into t(id) values(1);
SES2: insert into t(id) values(2);
SES1: insert into t(id) values(2);(掛住,等待SES2提交或者回滾)
SES2: insert into t(id) values(1);(掛住,等待SES1提交或者回滾,此時SES1和SES2互相等待,形成死鎖)

以上都是模擬引起死鎖的最簡單的情況,實際中,引起死鎖的語句可能是由UPDATE、DELETE、INSERT混合而成。約束會增大UPDATE和INSERT引起死鎖的可能性,外建上沒有索引會增大所有DML引起是死鎖的可能性。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63724/,如需轉載,請註明出處,否則將追究法律責任。

相關文章