環境: 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:
begintran
t1--
r1update r1 set num =
91where name ='張三
'--r2update r2 set num =
91where name ='李四
'rollback
tran t1
任務2:
begintran
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 ...