模擬 SQLSERVER 死鎖

環(huán)境: sqlserver 2008


事務(wù)(進(jìn)程 ID (n))與另一個(gè)進(jìn)程被死鎖在鎖資源上,并且已被選作死鎖犧牲品。請(qǐng)重新運(yùn)行


死鎖原理:

如兩個(gè)任務(wù)

任務(wù)1,已經(jīng)鎖定R1,再進(jìn)行請(qǐng)求R2<R2此時(shí)被任務(wù)2鎖定>

任務(wù)2,已經(jīng)鎖定R2,再進(jìn)行請(qǐng)求R1<R1此時(shí)被任務(wù)1鎖定>

導(dǎo)致兩個(gè)任務(wù)都進(jìn)入了阻塞。SQLSERVER會(huì)選擇一個(gè)進(jìn)行犧牲。


了解了原理后,來(lái)段SQL


-- 表結(jié)構(gòu)和模擬數(shù)據(jù)CREATETABLE R1(

? ? ID INTNOTNULL,

? ? Name varchar(50)NULL,

? ? Num INTNULLCONSTRAINT[PK_R1]PRIMARYKEYCLUSTERED

(

? ? [ID]ASC)

? ? WITH(PAD_INDEX=OFF, STATISTICS_NORECOMPUTE=OFF,

? ? IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS=ON,

? ? ALLOW_PAGE_LOCKS =ON)

? ? ON[PRIMARY]) ON[PRIMARY]GOINSERTINTOR1(ID, Name, Num)VALUES(1,'張三',50)INSERTINTOR1(ID, Name, Num)VALUES(2,'李四',50)CREATETABLE R2(

? ? ID INTNOTNULL,

? ? Name varchar(50)NULL,

? ? Num INTNULLCONSTRAINT[PK_R2]PRIMARYKEYCLUSTERED

(

? ? [ID]ASC)

? ? WITH(PAD_INDEX=OFF, STATISTICS_NORECOMPUTE=OFF,

? ? IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS=ON,

? ? ALLOW_PAGE_LOCKS =ON)

? ? ON[PRIMARY]) ON[PRIMARY]GOINSERTINTOR2(ID, Name, Num)VALUES(1,'張三',50)INSERTINTOR2(ID, Name, Num)VALUES(2,'李四',50)


任務(wù)1:

begin tran t1

-- R1

update [dbtest].[dbo].[R1] SET Num = 91 WHERE Name = '張三'

-- R2

update [dbtest].[dbo].[R2] SET Num = 91 WHERE Name = '李四'

rollback tran t1


任務(wù)2:

begin tran t2

-- R2

update [dbtest].[dbo].[R2] SET Num = 91 WHERE Name = '李四'

-- R1

update [dbtest].[dbo].[R1] SET Num = 91 WHERE Name = '張三'

rollback tran t2


執(zhí)行方法:

1.在任務(wù)1里面執(zhí)行前兩句(開(kāi)啟事務(wù), 鎖定R1)

2.然后切換到任務(wù)2里面執(zhí)行前兩句(開(kāi)啟事務(wù), 鎖定R2)

3.在任務(wù)1里面執(zhí)行鎖定R2(update R2…)此時(shí)要請(qǐng)求的R2被任務(wù)2鎖定

4.在任務(wù)2里面執(zhí)行鎖定R1(Update R1…)此時(shí)請(qǐng)求的R1被任務(wù)1鎖定。

進(jìn)入了死鎖,然后會(huì)彈出死鎖的信息。

消息 1205,級(jí)別 13,狀態(tài) 51,第 2 行?

事務(wù)(進(jìn)程 ID 89)與另一個(gè)進(jìn)程被死鎖在 鎖 資源上,并且已被選作死鎖犧牲品。請(qǐng)重新運(yùn)行該事務(wù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 產(chǎn)生死鎖的四個(gè)必要條件: (1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。 (2) 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)...
    像敏銳的狗閱讀 1,117評(píng)論 0 0
  • 死鎖產(chǎn)生的原因和解鎖的方法 產(chǎn)生死鎖的四個(gè)必要條件: (1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。 (2) ...
    憩在河岸上的魚(yú)丶閱讀 1,547評(píng)論 0 4
  • 摘要:SQL Server死鎖的捕獲、分析和解決方法。 一、什么是死鎖? 簡(jiǎn)單來(lái)說(shuō),我和你,金鎖和銀鎖。 我拿著金...
    暖夏未眠丶閱讀 1,497評(píng)論 0 0
  • 2017/3/14 RDBMS:關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng) 關(guān)系模型獨(dú)立于語(yǔ)言 SQL有幾種不同類型的語(yǔ)言:數(shù)據(jù)定義語(yǔ)言...
    ancherl閱讀 1,807評(píng)論 0 6
  • MYSQL 基礎(chǔ)知識(shí) 1 MySQL數(shù)據(jù)庫(kù)概要 2 簡(jiǎn)單MySQL環(huán)境 3 數(shù)據(jù)的存儲(chǔ)和獲取 4 MySQL基本操...
    Kingtester閱讀 8,071評(píng)論 5 115

友情鏈接更多精彩內(nèi)容