SQLServer鎖和並發控制


鎖:是數據庫引擎用來同步多個用戶同時對一個數據塊訪問的一種機制。

鎖的粒度和層次結構

數據庫引擎具有多粒度鎖定,允許一個事務鎖定不同類型的資源。

鎖定在較小的粒度(例如行)可以提高並發度,但開銷大,因為鎖定的范圍越小,需要的鎖就越多(鎖定了許多行,就需要持有更多的鎖);鎖定在較大的粒度(例如表)會降低並發度,但是消耗較低,因為鎖定的范圍大,需要的鎖就越小(鎖定了表,限制了其他事物對表的訪問)。

數據庫引擎通常必須獲取多粒度級別上的鎖才能完整地保護資源。這種多粒度級別上的鎖稱為鎖層次結構

可鎖定的資源:

鎖模式:

數據庫引擎使用不同的鎖模式鎖定資源,這些鎖模式確定了並發事務訪問資源的方式。

共享鎖(S) :讀取產生的鎖,防止其他事務對其的修改

更新鎖(U) :可防止死鎖,在共享鎖與排他鎖之間,與共享鎖兼容,與排他鎖不兼容。

排他鎖(X) :用於數據增刪改操作。鎖定時數據無法修改與讀取(在nolock或未提交讀隔離級別時可以臟讀)

意向鎖(I) :意向共享鎖(IS),意向排他(IX),意向更新(IU),共享意向更新(SIU),更新意向排他(UIX)

架構所(Sch-):架構穩定性鎖(Sch-M),架構穩定性鎖(Sch-S)

大容量更新鎖(BU):當將數據大容量復制到表,且指定TABLEOCK提示或者使用sp_tableoption設置了table lockon bulk表選項時,將使用大容量更新鎖。大容量更新鎖允許多個線程將數據並發地大容量加載到同一表,同時防止其他不進行大容量加載數據的進程訪問該表。

鎖關鍵字

NOLOCK:不鎖定任何資源(僅在SELECT語句中使用)

ROWLOCK:行鎖

PAGELOCK:頁鎖

TABLOCK:表共享鎖,其他事務可以讀取表,但不能更新刪除

TABLOCKX:表獨占鎖,其他事務不能讀取表,更新和刪除

UPDATELOCK : 表提示指定在讀取的每一行上設置一個更新鎖定,直到整個語句或事物執行完畢,才釋放這個鎖定。允許其他事務獲取同一行的共享鎖定,但不允許他們更新行

XLOCK:指定才用排他鎖並保持到事務完成。

HOLDLOCK:保持表鎖定直到事務執行完畢。

並發控制類型

1. 悲觀鎖並發控制:用到鎖來保護數據。用於鎖消耗低於回滾事務的成本環境中;(相信並發是絕大部分的,並且每一個線程都必須要達到目的)

2. 樂觀鎖並發控制:並發過程中不產生鎖,讀取數據后檢查用戶數據,判斷是否產生錯誤, 回滾事務。用於數據爭用少的環境。(相信並發是極少數的,假設運氣不好遇到了,就放棄並返回信息告訴它再次嘗試。因為它是極少數發生的。)

悲觀鎖一定成功,但在並發量特別大的時候會造成很長堵塞甚至超時,僅適合小並發的情況。

樂觀鎖不一定每次都修改成功,但能充分利用系統的並發處理機制,在大並發量的時候效率要高很多。

並發可能導致的影響

1. 丟失更新:多個事務同時更新同一行;

2. 臟讀:修改過程中的數據被讀取;

3. 不一致的分析(不可重復讀):讀取的事務里面,符合讀取條件的行搜索條件被更改了;(Update)

4. 幻讀:讀取的事務里面,符合讀取條件的行被刪除或者插入了;(Insert.Delete)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM