如何避免死鎖

2021-06-03 11:32:20 字數 1921 閱讀 2335

如何避免死鎖

1 使用事務時,盡量縮短事務的邏輯處理過程,及早提交或回滾事務;

2 設定死鎖超時引數為合理範圍,如:3分鐘-10分種;超過時間,自動放棄本次操作,避免程序懸掛;

3 優化程式,檢查並避免死鎖現象出現;

4 .對所有的指令碼和sp都要仔細測試,在正是版本之前。

5 所有的sp都要有錯誤處理(通過@error)

6 一般不要修改sql server事務的預設級別。不推薦強行加鎖

鎖定記錄,只允許單使用者修改的例子

create table #鎖表(編號 int)

--**:

if exists(select 1 from 編號='你的編號')

return

insert #鎖表 values('你的編號')

.....你處理的**

delete #鎖表 where 編號='你的編號'

--------------------------------------

create table #鎖表(編號 int,時間 datetime)

--**:

if exists(select 1 from 編號='你的編號' and datediff(ss,時間,getdate())<5 --如果鎖的時候超過5秒,則是處理超時

) return

delete from #鎖表

insert #鎖表 values('你的編號',getdate())

.....你處理的**

delete #鎖表 where 編號='你的編號'

---------------------------------------

--鎖定記錄,只允許單使用者修改的例子:

--建立測試環境

--建立測試表--部門表

create table 部門(departmentid int,name varchar(10))

--記錄鎖定表

create table lock(departmentid int,dt datetime)

go--因為函式中不可以用getdate,所以用個檢視,得到當前時間

create view v_getdate as select dt=getdate()

go--建立自定義函式,判斷記錄是否鎖定

create function f_chk(@departmentid int)

returns bit

asbegin

declare @re bit,@dt datetime

select @dt=dt from v_getdate

if exists(select 1 from lock where departmentid=@departmentid

and datediff(ss,dt,@dt)<5)

set @re=1

else

set @re=0

return(@re)

endgo

--資料處理測試

if dbo.f_chk(3)=1

print '記錄被鎖定'

else

begin

begin tran

insert into lock values(3,getdate())

update 部門 set name='a' where departmentid=3

delete from lock where departmentid=3

commit tran

end--刪除測試環境

drop table 部門

drop view v_getdate

drop function f_chk

如何避免死鎖

什麼是死鎖,如何避免死鎖?執行緒a需要資源x,而執行緒b需要資源y,而雙方都掌握有對方所要的資源,這種情況稱為死鎖 deadlock 或死亡擁抱 the deadly embrace 在併發程式設計中,死鎖 deadlock 是一種十分常見的邏輯錯誤。通過採用正確的程式設計方式,死鎖的發生不難避免。...

如何避免死鎖

什麼是死鎖,如何避免死鎖?執行緒a需要資源x,而執行緒b需要資源y,而雙方都掌握有對方所要的資源,這種情況稱為死鎖 deadlock 或死亡擁抱 the deadly embrace 在併發程式設計中,死鎖 deadlock 是一種十分常見的邏輯錯誤。通過採用正確的程式設計方式,死鎖的發生不難避免。...

如何避免死鎖

系統安全狀態 1.安全狀態 按某種程序順序來分配資源,直至滿足每個程序對資源的最大需求,使每個程序都能順利完成,如果系統找到這樣乙個安全序列,則成系統處於安全狀態 系統處於不安全狀態不意味著一定會轉入死鎖 死鎖定理 s為死鎖狀態的充分條件是 當且僅當s狀態的資源分配圖是不可完全簡化的。若分配圖不能完...