- 相關(guān)推薦
sql server中避免死鎖的方法
一、死鎖的四個(gè)必要條件
1、互斥條件(Mutual exclusion):資源不能被共享,只能由一個(gè)進(jìn)程使用。
2、請求與保持條件(Hold and wait):已經(jīng)得到資源的進(jìn)程可以再次申請新的資源。
3、非剝奪條件(No pre-emption):已經(jīng)分配的資源不能從相應的進(jìn)程中被強制地剝奪。
4、循環(huán)等待條件(Circular wait):系統中若干進(jìn)程組成環(huán)路,該環(huán)路中每個(gè)進(jìn)程都在等待相鄰進(jìn)程正占用的資源。
二、 避免死鎖
1、按同一順序訪(fǎng)問(wèn)對象
如果所有并發(fā)事務(wù)按同一順序訪(fǎng)問(wèn)對象,則發(fā)生死鎖的可能性會(huì )降低。例如,如果兩個(gè)并發(fā)事務(wù)獲得 Supplier 表上的鎖,然后獲得 Part 表上的鎖,則在其中一個(gè)事務(wù)完成之前,另一個(gè)事務(wù)被阻塞在 Supplier 表上。第一個(gè)事務(wù)提交或回滾后,第二個(gè)事務(wù)繼續進(jìn)行。不發(fā)生死鎖。將存儲過(guò)程用于所有的數據修改可以標準化訪(fǎng)問(wèn)對象的順序。
2、避免事務(wù)中的用戶(hù)交互
避免編寫(xiě)包含用戶(hù)交互的事務(wù),因為運行沒(méi)有用戶(hù)交互的批處理的速度要遠遠快于用戶(hù)手動(dòng)響應查詢(xún)的速度,例如答復應用程序請求參數的提示。例如,如果事務(wù)正在等待用戶(hù)輸入,而用戶(hù)去吃午餐了或者甚至回家過(guò)周末了,則用戶(hù)將此事務(wù)掛起使之不能完成。這樣將降低系統的吞吐量,因為事務(wù)持有的任何鎖只有在事務(wù)提交或回滾時(shí)才會(huì )釋放。即使不出現死鎖的情況,訪(fǎng)問(wèn)同一資源的其它事務(wù)也會(huì )被阻塞,等待該事務(wù)完成。
3、保持事務(wù)簡(jiǎn)短并在一個(gè)批處理中
在同一數據庫中并發(fā)執行多個(gè)需要長(cháng)時(shí)間運行的事務(wù)時(shí)通常發(fā)生死鎖。事務(wù)運行時(shí)間越長(cháng),其持有排它鎖或更新鎖的時(shí)間也就越長(cháng),從而堵塞了其它活動(dòng)并可能導致死鎖。
保持事務(wù)在一個(gè)批處理中,可以最小化事務(wù)的網(wǎng)絡(luò )通信往返量,減少完成事務(wù)可能的延遲并釋放鎖。
4、使用低隔離級別
確定事務(wù)是否能在更低的隔離級別上運行。執行提交讀允許事務(wù)讀取另一個(gè)事務(wù)已讀取(未修改)的數據,而不必等待第一個(gè)事務(wù)完成。使用較低的隔離級別(例如提交讀)而不使用較高的隔離級別(例如可串行讀)可以縮短持有共享鎖的時(shí)間,從而降低了鎖定爭奪。
5、使用綁定連接
使用綁定連接使同一應用程序所打開(kāi)的兩個(gè)或多個(gè)連接可以相互合作。次級連接所獲得的任何鎖可以象由主連接獲得的鎖那樣持有,反之亦然,因此不會(huì )相互阻塞
6、SELECT語(yǔ)句加With(NoLock)提示
默認情況下SELECT語(yǔ)句會(huì )對查詢(xún)到的資源加S鎖(共享鎖),S鎖與X鎖(排他鎖)不兼容;但加上With(NoLock)后,SELECT不對查詢(xún)到的資源加鎖(或者加Sch-S鎖,Sch-S鎖可以與任何鎖兼容);從而可以是這兩條SQL可以并發(fā)地訪(fǎng)問(wèn)同一資源。當然,此方法適合解決讀與寫(xiě)并發(fā)死鎖的情況,但加With(NoLock)可能會(huì )導致臟讀。
【sql server中避免死鎖的方法】相關(guān)文章:
Sql Server、Access數據排名的實(shí)現方法07-09
有關(guān)清除SQL Server日志的兩種方法07-20
SQL中的單記錄函數08-12
2016最新J2EE中SQL語(yǔ)句自動(dòng)構造方法08-02
PL/SQL編程中的經(jīng)驗小結09-21