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