mssql鎖基礎教程
1.了解鎖 鎖定是數據庫引擎用來同步多個用戶同時對同一個數據塊的訪問的一種機制。 在事務獲取數據塊當前狀態的依賴關系之前,它必須保護自己不受其他事務對同一數據進行修改的影響。
鎖粒度和層次結構
RID 用于鎖定堆中的單個行的行標識符。 KEY 索引中用于保護可序列化事務中的鍵范圍的行鎖。 PAGE 數據庫中的 8 KB 頁,例如數據頁或索引頁。 EXTENT 一組連續的八頁,例如數據頁或索引頁。 HOBT 堆或 B 樹。保護索引或沒有聚集索引的表中數據頁堆的鎖。 TABLE 包括所有數據和索引的整個表。 FILE 數據庫文件。 APPLICATION 應用程序專用的資源。 METADATA 元數據鎖。 ALLOCATION_UNIT 分配單元。 DATABASE 整個數據庫。
鎖模式: 共享鎖(S):用于只讀操作(SELECT),鎖定共享的資源。共享鎖不會阻止其他用戶讀,但是阻止其他的用戶寫和修改。 排他(獨占)鎖(X): 用于數據修改操作,例如 INSERT、UPDATE 或 DELETE。確保不會同時對同一資源進行多重更新。 更新鎖(U): 當更新事務數據需要獲取排它鎖時,必須先獲取更新瑣。引擎為防止死鎖的發生,一次允許允許一個事務可以獲得資源的更新鎖(U 鎖),只有獲取更新鎖的查詢才可創建排它鎖。 意向鎖: 用于建立鎖的層次結構。意向鎖的類型有:意向共享 (IS)、意向排他 (IX) 以及意向排他共享 (SIX)。引擎在創建共享鎖和獨占鎖之前,先使用意向鎖來保護共享鎖(S 鎖)或排他鎖(X 鎖)放置在鎖層次結構的底層資源上 架構鎖(Sch-M):執行表的數據定義語言 (DDL) 操作時使用架構鎖。在架構修改鎖起作用的期間,該鎖之外的所有操作都將被阻止. 大容量更新鎖(BU 鎖):當將數據大容量復制到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 設置了 table lock on bulk 表選項時,將使用大容量更新鎖。大容量更新鎖(BU 鎖)允許多個線程將數據并發地大容量加載到同一表,同時防止其他不進行大容量加載數據的進程訪問該表。
監視與管理鎖
使用 SQL Server Profiler監視Locks 事件,來捕獲有關跟蹤中鎖事件的信息的鎖事件類別。 使用系統監視器監視SQL Server Locks 對象,監視數據庫引擎實例中的鎖級別。 查詢 sys.dm_tran_locks 動態管理視圖獲得有關數據庫引擎 實例中鎖當前狀態的信息。 使用系統存儲過程sp_lock (Transact-SQL) 返回有關數據庫引擎實例中的活動鎖的信息。對于 SQL Server 2005,請改用 sys.dm_tran_locks 動態管理視圖。 使用系統視圖sys.syslockinfo (Transact-SQL)返回有關數據庫引擎 實例中的活動鎖的信息。對于 SQL Server 2005,請改用 sys.dm_tran_locks 動態管理視圖。
將死鎖減至最少
按同一順序訪問對象。 避免事務中的用戶交互。 保持事務簡短并處于一個批處理中。 使用較低的隔離級別。 使用基于行版本控制的隔離級別。 將 READ_COMMITTED_SNAPSHOT 數據庫選項設置為 ON,使得已提交讀事務使用行版本控制。 使用快照隔離。 使用綁定連接。
