模擬 SQLSERVER 死鎖

2022-04-01 12:49:23 字數 2184 閱讀 2827

環境: sqlserver 2008

事務(程序 id (n))與另乙個程序被死鎖在鎖資源上,並且已被選作死鎖犧牲品。請重新執行

死鎖原理:

如兩個任務

任務1,已經鎖定r1,再進行請求r2任務2,已經鎖定r2,再進行請求r1導致兩個任務都進入了阻塞。sqlserver會選擇乙個進行犧牲。

了解了原理後,來段sql

--

表結構和模擬資料

create

table

r1( id

intnot

null

, name

varchar(50) null

, num

intnull

constraint

[pk_r1

]primary

keyclustered

( [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]go

insert

into r1(id, name, num) values(1, '

張三', 50

)insert

into r1(id, name, num) values(2, '

李四', 50

)create

table

r2( id

intnot

null

, name

varchar(50) null

, num

intnull

constraint

[pk_r2

]primary

keyclustered

( [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]go

insert

into r2(id, name, num) values(1, '

張三', 50

)insert

into r2(id, name, num) values(2, '

李四', 50)

任務1:

begin

tran

t1--

r1update r1 set num =

91where name ='張三

'--r2update r2 set num =

91where name ='李四

'rollback

tran t1

任務2:

begin

tran

t2--

r2update r2 set num =

91where name ='李四

'--r1update r1 set num =

91where name ='張三

'rollback

tran t2

執行方法:

1.在任務1裡面執行前兩句(開啟事務, 鎖定r1)

2.然後切換到任務2裡面執行前兩句(開啟事務, 鎖定r2)

3.在任務1裡面執行鎖定r2(update r2…)此時要請求的r2被任務2鎖定

4.在任務2裡面執行鎖定r1(update r1…)此時請求的r1被任務1鎖定。

進入了死鎖,然後會彈出死鎖的資訊。

訊息 1205,級別 13,狀態 51,第 2 行

事務(程序 id 89)與另乙個程序被死鎖在 鎖 資源上,並且已被選作死鎖犧牲品。請重新執行該事務。

sqlserver死鎖阻塞

create proc p lockinfo kill lock spid bit 1,是否殺掉死鎖的程序,1 殺掉,0 僅顯示 show spid if nolock bit 1 如果沒有死鎖的程序,是否顯示正常程序資訊,1 顯示,0 不顯示 as declare count int,s nvar...

SQL Server清除死鎖

1 首先需要判斷是哪個使用者鎖住了哪張表.查詢被鎖表 select request session id spid,object name resource associated entity id tablenamefrom sys.dm tran locks where resource typ...

oracle死鎖模擬

用plsql developer新建乙個command window視窗,執行 update a g set g.status 9 where seq id in 3407144 休眠8秒 exec dbms lock.sleep 8 update a g set g.status 9 where ...