您好,登錄后才能下訂單哦!
- 丟失更新 -- 在這種情況下,事務與事務之間沒有隔離。多個事務能夠讀取同一份數據并且修改它。最后對數據集做出修改的事務將勝出,而其他所有事務所作的修改都丟失了。
- 臟讀 -- 在這種情況下,一個事務能夠讀取正被其他事務修改的數據。被第一個事務讀取的數據是不一致的,因為另一個事務可能會回滾所作的修改。
- 不可重復讀 -- 這種情況有點類似于沒有任何隔離,一個事務兩次讀取數據,但是在第二次讀取發生前,另一個事務修改了該數據;因此,兩次讀取所得到的結果是不同的。因為讀操作不能保證每次都是課重復進行的,這種情況被稱作“不可重復讀”。
- 幻讀 -- 這種情況類似于不可重復讀。然而,不是先前被讀取的實際行在事務完成前發生了改變,而是額外的行被添加到了表中,導致第二次讀取返回了不同的行集合。
(詳情請參考我的另一篇blog:SQL Server 2008 R2 事務與隔離級別實例講解)
- Read Uncommitted
- Read Committed
- Repeatable Read
- Serializable
- Snapshot
- Read Committed Snapshot
除了選擇鎖類型,Lock Manager還基于所執行語句的性質以及所影響的行數自動地調整鎖粒度(如row, page, table)。
- 共享鎖
- 更新鎖
- 獨占鎖
- 意向鎖
- 架構鎖
- 大容量更新鎖
- DATABASE -- 無論何時當一個SQL Server 進程正在使用除master以外的數據庫時,Lock Manager為該進程授予數據庫級的鎖。數據庫級的鎖總是共享鎖,用于跟蹤何時數據庫在使用中,以防其他進程刪除該數據庫,將數據庫置為脫機,或者恢復數據庫。注意,由于master和tempdb數據庫不能被刪除或置為脫機,所以不需要在它們之上加鎖。
- FILE-- 文件級的鎖用于鎖定數據庫文件。
- EXTENT -- Extent鎖用于鎖定extents,通常僅在空間分配和重新分配的時候使用。一個extent由8個連續的數據頁或索引頁組成。Extent鎖可以是共享鎖也可以是獨占鎖。
- ALLOCATION_UNIT -- 使用在數據庫分配單元上。
- TABLE -- 這種級別的鎖將鎖定整個表,包括數據和索引。何時將獲得表級鎖的例子包括在Serializable隔離級別下從包含大量數據的表中選取所有的行,以及在表上執行不帶過濾條件的update或delete。
- Heap or B-Tree (HOBT) -- 用于堆數據頁,或者索引的二叉樹結構。
- PAGE -- 使用頁級鎖,由8KB數據或者索引信息組成的整個頁被鎖定。當需要讀取一頁的所有行或者需要執行頁級別的維護如頁拆分后更新頁指針時,將會獲取頁級鎖。
- Row ID (RID) -- 使用RID鎖,頁內的單一行被鎖定。無論何時當提供最大化的資源并發性訪問是有效并且可能時,將獲得RID鎖。
- KEY -- SQL Server使用兩種類型的Key鎖。其中一個的使用取決于當前會話的鎖隔離級別。對于運行于Read Committed 或者 Repeatable Read 隔離模式下的事務,SQL Server 鎖定與被訪問的行相關聯的的實際索引key。(如果是表的聚集索引,數據行位于索引的葉級。行上在這些你看到的是Key鎖而不是行級鎖。)若在Serializable隔離模式下,通過鎖定一定范圍的key值從而不允許新的行插入到該范圍內,SQL Server防止了“幻讀”。這些鎖因而被稱作“key-range lock”。
- METADATA -- 用于鎖定系統目錄信息(元數據)。
- APPLICATION -- 允許用戶定義他們自己的鎖,指定資源名稱、鎖模式、所有者、timeout間隔。
人們經常以為死鎖發生在數據頁級或數據行級。事實上,死鎖經常發生在索引頁級或索引鍵級。下圖展示了由于索引鍵級的競爭引發的死鎖場景。
- 循環死鎖 -- 兩個進程請求不同資源上的鎖,每一個進程都需要對方持有的該資源上的鎖,這時將發生循環死鎖。如下圖。
- 轉換死鎖-- 兩個或多個進程都在事務中持有同一資源上的共享鎖,并且都想把它升級為獨占鎖,但是,誰也沒法升級直到其他的進程釋放共享鎖。 如圖所示。
- HOLDLOCK -- 在語句執行期間,或者在整個事務期間(如果語句在事務中的話)保持共享鎖。該選項等同于Serializable 隔離級別。
- NOLOCK -- 使用此選項指定不對資源施加共享鎖。它類似于在0隔離級別(Read Uncommitted)下運行查詢。NOLOCK選項在對結果精度要求不嚴格的報表工作環境下很有用。
- READUNCOMMITTED -- 與指定 Read Uncommitted 隔離級別和NOLOCK提示完全一樣。
- READCOMMITTED -- 與指定 Read Committed 隔離級別一樣。
- READCOMMITTEDLOCK -- 當數據被讀取時獲得共享鎖,讀取完成時釋放共享鎖,不管是否設定了 READ_COMMITTED_SNAPSHOT 隔離級別。
- REPEATABLEREAD -- 與指定 Repeatable Read 隔離級別一樣,類似于HOLDLOCK提示。
- SERIALIZABLE -- 與指定 Serializable 隔離級別一樣,類似于HOLDLOCK提示。
- READPAST -- 讓查詢忽略被其他事務鎖定的行或頁,僅返回能夠被讀取的數據。只能用在運行于Read Committed 或 Repeatable Read 隔離級別下的事務中。
- ROWLOCK -- 強制 Lock Manager 在資源上施加行級鎖而非頁級鎖或表級鎖。
- PAGLOCK -- 強制 Lock Manager 在資源上施加頁級鎖而非行級鎖或表級鎖。
- TABLOCK -- 強制 Lock Manager 在資源上施加表級鎖而非行級鎖或頁級鎖。
- TABLOCKX -- 強制 Lock Manager 在資源上施加表級獨占鎖而非行級鎖或頁級鎖。
- UPDLOCK -- 類似于HOLDLOCK,不過HOLDLOCK在資源上應用共享鎖,而UPDLOCK是在事務期間應用更新鎖。
- XLOCK -- 在事務期間在資源上應用獨占鎖。它阻止其他事務獲取該資源上的鎖。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。