標籤:blog http io ar os 使用 sp strong 檔案
所謂的死結,主要是由於進程B要訪問進程A所在的資源,而進程A又由於種種原因,不釋放掉其所佔用的資源,所以資料庫就會一直處於阻塞狀態。
四個必要條件:
必要條件:互斥,一個資源,在同一時間點上,只能由一個進程訪問。
死結分析:當任務TA在使用資源RA的時候,產生了未預知的問題,從而意外的停止了執行,但是還沒有釋放RA,所以就造成的對資源RA的死結,這個也是死結產生最根本的原因,其他的原因基本上都是由這個為基礎的。
必要條件:資源的請求與保持,每一個進程都可以在使用一個資源的同時,申請訪問另一個資源。
死結分析:由於每一個進程都可以申請訪問多個資源,所以當任務TA使用資源RA的時候,申請訪問正在被任務TB使用的資源RB,而此時,TB要申請正在被TA使用的RA,所以就造成了互相等待的情況,從而死結。
必要條件:資源的非剝奪,進程無法將正在被其他進程使用的資源強行剝奪過來。
死結分析:當產生其他情況的時候,正是由於這個條件,從而造成的進程的無止境等待。
必要條件:資源的迴圈等待
死結分析:TA申請RA,而TB正在使用RA,同時TB申請RB,但TC正在使用RB,此時TC申請RC,而RC正在被TA使用,從而產生死結。
可能產生死結的資源
- RID,堆中的單行
- KEY,索引中的鍵,行鎖
- PAG,頁
- EXT,區結構
- HOBT,堆或B樹
- TAB,表,包括資料和索引
- File,資料庫檔案
- APP,應用程式專用資源
- METADATA,中繼資料
- Allocation_Unit,配置單位
- DB,整個資料庫
避免產生死結的方法
由於死結是因為上述的四個必要條件共同作用所產生的,所以按照一般的思路,只要能夠打破其中一個,就可以有效避免死結的產生。
下面是針對四個必要條件所可以作出的處理:
- 允許資源的並發訪問。
- 允許進程的資源剝奪。
- 進程遠行所需資源一次提交。
- 資源的有序分配,也就是按同一順序訪問資源。
其他方法(這些方法的主要目標是使資源的佔用時間最小化,從而降低死結的產生機會):
- 避免事務中的使用者互動。
- 保持事務中簡短並處於一個批處理中。
- 使用較低層級的隔離等級。
- 使用基於資料列版本設定的隔離等級。
- 使用綁定串連,及將多個會話綁定到一個事務中,這樣可以有效減少事務的數量。
轉自http://www.cnblogs.com/sitemanager/archive/2012/03/26/2417638.html
主要參考文章:
- http://www.cnblogs.com/happyhippy/archive/2008/11/14/1333922.html 「強烈推薦」
- http://msdn.microsoft.com/zh-cn/library/ms177433.aspx 「MSDN」
- http://www.cnblogs.com/ching/archive/2012/02/01/2334659.html 「很詳細的另一篇」
sqlserver 死結筆記(轉)