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