如何避免死鎖
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狀態的資源分配圖是不可完全簡化的。若分配圖不能完...