鎖和死鎖

封鎖就是一個事務可向系統提出請求,對被操作的數據加鎖(Lock)。其他事務必須等到此事務解鎖(Unlock)之後才能訪問該數據。從而,在多個用戶併發訪問數據庫時,確保不互相干擾。可鎖定的單位是:行、頁、表、盤區和數據庫。

鎖的類型

從數據庫系統的角度來看,分爲共享(S)鎖、獨佔(X)鎖、更新(U)鎖,具體如下:

▶共享(S)鎖:用於讀操作

多個事務可封鎖一個共享單位的數據,任何事務都不能修改加S鎖的數據,通常是加S鎖的數據被讀取完畢,S鎖立即被釋放。

▶獨佔(X)鎖:用於寫操作

僅允許一個事務封鎖此共享數據,其他任何事務必須等到X鎖被釋放才能對該數據進行訪問,X鎖一直到事務結束才能被釋放

▶更新(U)鎖

用來預定要對此頁施加X鎖,它允許其他事務讀,但不允許再施加U鎖或X鎖,當被讀取數據頁將要被更新時,則升級爲X鎖,U鎖一直到事務結束時才能被釋放。

從程序員的角度看,分爲樂觀鎖和悲觀鎖,具體如下:

▶Const adLockReadOnly = 1 缺省的上鎖類型,只讀方式上鎖允許多個用戶同時讀取同樣的數據,但不能改變數據,無法運行AddNew、Update及Delete等方法。

 ▶Const adLockPessimistic = 2 以悲觀上鎖方式打開數據對象,當數據源正在更新時,系統會暫時鎖住其他用戶的動作,以保持數據一致性,該方式假定在你編輯記錄時會有其它用戶訪問數據。此時一旦你開始編輯記錄,其它用戶就不能訪問該數據。

▶Const adLockOptimistic = 3 以樂觀上鎖方式打開數據對象,當數據源正在更新時,系統並不會鎖住其他用戶的動作,其他用戶可以對數據進行增、刪、改的操作,該方式假定在你編輯記錄時不會有其它用戶訪問數據。在完成改變之前,其它用戶不能訪問該記錄。

▶Const adLockBatchOptimistic = 4 執行多行批處理更新時使用這種類型,當數據源正在更新時,其他用戶必須將CursorLocation屬性改爲adUdeClientBatch才能對數據進行增、刪、改的操作,打開一個記錄集時,你可以指定一個Options參數。

死鎖

死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程。

一種情形,此時執行程序中兩個或多個線程發生永久堵塞,每個線程都在等待被其他線程佔用並堵塞了的資源。

例如:如果線程A鎖住了記錄1並等待記錄2,而線程B鎖住了記錄2並等待記錄1,這樣兩個線程就發生了死鎖現象。

▶產生死鎖的必要條件:

  1. 互斥條件:一個資源每次只能被一個進程使用
  2. 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放
  3. 不剝奪條件:進程已獲得的資源,在未使用完之前,不能強行剝奪
  4. 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係

這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖

▶死鎖的解除和預防:

  • 按同一順序訪問對象
  • 避免事務中的用戶交互
  • 保持事務簡短並在一個批處理中
  • 使用低隔離級別
  • 使用綁定連接

 使用事務時,儘量縮短事務的邏輯處理過程,及早提交或回滾事務; 優化程序,檢查並避免死鎖現象出現; 一般不要修改SQL SERVER事務的默認級別,不推薦強行加鎖 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章