星期五, 6月 01, 2012

[SQL] 模擬死結產生

根據 MSDN 將死結數量降至最低 裡的圖型模擬死結產生 ~~

[SQL] 模擬死結產生

在 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
藉此產生一個死結。

  • 建立測試資料
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
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
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) 在 鎖定 資源上被另一個處理序鎖死並已被選擇作為死結的犧牲者。請重新執行該交易。

沒有留言:

張貼留言