引用自:http://jengting.blogspot.tw/2012/06/sql.html
根據 MSDN 將死結數量降至最低 裡的圖型模擬死結產生 ~~
在 SSMS 內開啟兩個 T-SQL 查詢(兩個執行緒),利用下面語法來執行,請先執行 T-SQL 查詢 1,再執行 T-SQL 查詢 2。
步驟簡易說明:
- Step 1:建立一個 T-SQL 查詢 1,開啟一個交易,並進行更新 Supplier 資料
- Step 2:建立另一個 T-SQL 查詢 2,開啟一個交易,並進行更新 Part
- Step 3:回到 T-SQL 查詢 1,更新 Part
- Step 4:回到 T-SQL 查詢 2,更新 Supplier
藉此產生一個死結。
- 建立測試資料
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
IF OBJECT_ID( 'Supplier' ) IS NOT NULL DROP TABLE Supplier IF OBJECT_ID( 'Part' ) IS NOT NULL DROP TABLE Part CREATE TABLE Supplier ( SPLNO char (5), SPLName char (10), CONSTRAINT [PK_Supplier] PRIMARY KEY CLUSTERED ([SPLNO] ASC ) ) CREATE TABLE Part ( SPLNO char (5), Product char (50), CONSTRAINT [PK_Part] PRIMARY KEY CLUSTERED ([SPLNO] ASC ,[Product] ASC ) ) INSERT INTO Supplier VALUES ( '00000' , 'Microsoft' ) INSERT INTO Part VALUES ( '00000' , 'SQL Server 2012' ) |
- T-SQL 查詢 1
1
2
3
4
5
|
BEGIN TRANSACTION UPDATE Supplier SET SPLName = 'Microsoft' WHERE SPLNO = '00000' -- Step 1 WAITFOR DELAY '00:00:05' UPDATE Part SET Product = 'SQL Server 2012' WHERE Product = 'SQL Server 2012' -- Step 3 COMMIT TRANSACTION |
- T-SQL 查詢 2
1
2
3
4
5
|
BEGIN TRANSACTION UPDATE Part SET Product = 'SQL Server 2012' WHERE Product = 'SQL Server 2012' -- Step 2 WAITFOR DELAY '00:00:05' UPDATE Supplier SET SPLName = 'Microsoft' WHERE SPLNO = '00000' -- Step 4 COMMIT TRANSACTION |
- 死結錯誤訊息
訊息 1205,層級 13,狀態 45,行 1
交易 (處理序識別碼 52) 在 鎖定 資源上被另一個處理序鎖死並已被選擇作為死結的犧牲者。請重新執行該交易。