|
1. 數(shù)據(jù)庫(kù)表鎖定原理
1.1 目前的C/S,B/S結(jié)構(gòu)都是多用戶訪問(wèn)數(shù)據(jù)庫(kù),每個(gè)時(shí)間點(diǎn)會(huì)有成千上萬(wàn)個(gè)user來(lái)訪問(wèn)DB,其中也會(huì)同時(shí)存取同一份數(shù)據(jù),會(huì)造成數(shù)據(jù)的不一致性或者讀臟數(shù)據(jù)。
1.2 事務(wù)的ACID原則
1.3 鎖是關(guān)系數(shù)據(jù)庫(kù)很重要的一部分, 數(shù)據(jù)庫(kù)必須有鎖的機(jī)制來(lái)確保數(shù)據(jù)的完整和一致性。
1.3.1 SQL Server中可以鎖定的資源:
1.3.2 鎖的粒度:
1.3.3 鎖的升級(jí):鎖的升級(jí)門限以及鎖升級(jí)是由系統(tǒng)自動(dòng)來(lái)確定的,不需要用戶設(shè)置。
1.3.4 鎖的類型
(1) 共享鎖:共享鎖用于所有的只讀數(shù)據(jù)操作。
(2) 修改鎖:修改鎖在修改操作的初始化階段用來(lái)鎖定可能要被修改的資源,這樣可以避免使用共享鎖造成的死鎖現(xiàn)象。
(3) 獨(dú)占鎖:獨(dú)占鎖是為修改數(shù)據(jù)而保留的。它所鎖定的資源,其他事務(wù)不能讀取也不能修改。獨(dú)占鎖不能和其他鎖兼容。
(4) 架構(gòu)鎖:結(jié)構(gòu)鎖分為結(jié)構(gòu)修改鎖(Sch-M)和結(jié)構(gòu)穩(wěn)定鎖(Sch-S)。執(zhí)行表定義語(yǔ)言操作時(shí),SQL Server采用Sch-M鎖,編譯查詢時(shí),SQL Server采用Sch-S鎖。
(5) 意向鎖:意向鎖說(shuō)明SQL Server有在資源的低層獲得共享鎖或獨(dú)占鎖的意向。
(6) 批量修改鎖:批量復(fù)制數(shù)據(jù)時(shí)使用批量修改鎖。
1.3.4 SQL Server鎖類型
(1) HOLDLOCK: 在該表上保持共享鎖,直到整個(gè)事務(wù)結(jié)束,而不是在語(yǔ)句執(zhí)行完立即釋放所添加的鎖。
(2) NOLOCK:不添加共享鎖和排它鎖,當(dāng)這個(gè)選項(xiàng)生效后,可能讀到未提交讀的數(shù)據(jù)或“臟數(shù)據(jù)”,這個(gè)選項(xiàng)僅僅應(yīng)用于SELECT語(yǔ)句。
(3) PAGLOCK:指定添加頁(yè)鎖(否則通常可能添加表鎖)。
(4) READCOMMITTED用與運(yùn)行在提交讀隔離級(jí)別的事務(wù)相同的鎖語(yǔ)義執(zhí)行掃描。默認(rèn)情況下,SQL Server 2000 在此隔離級(jí)別上操作。
(5) READPAST: 跳過(guò)已經(jīng)加鎖的數(shù)據(jù)行,這個(gè)選項(xiàng)將使事務(wù)讀取數(shù)據(jù)時(shí)跳過(guò)那些已經(jīng)被其他事務(wù)鎖定的數(shù)據(jù)行,而不是阻塞直到其他事務(wù)釋放鎖,READPAST僅僅應(yīng)用于READ COMMITTED隔離性級(jí)別下事務(wù)操作中的SELECT語(yǔ)句操作。
(6) READUNCOMMITTED:等同于NOLOCK。
(7) REPEATABLEREAD:設(shè)置事務(wù)為可重復(fù)讀隔離性級(jí)別。
( 8) ROWLOCK:使用行級(jí)鎖,而不使用粒度更粗的頁(yè)級(jí)鎖和表級(jí)鎖。
(9) SERIALIZABLE:用與運(yùn)行在可串行讀隔離級(jí)別的事務(wù)相同的鎖語(yǔ)義執(zhí)行掃描。等同于 HOLDLOCK。
(10) TABLOCK:指定使用表級(jí)鎖,而不是使用行級(jí)或頁(yè)面級(jí)的鎖,SQL Server在該語(yǔ)句執(zhí)行完后釋放這個(gè)鎖,而如果同時(shí)指定了HOLDLOCK,該鎖一直保持到這個(gè)事務(wù)結(jié)束。
(11) TABLOCKX:指定在表上使用排它鎖,這個(gè)鎖可以阻止其他事務(wù)讀或更新這個(gè)表的數(shù)據(jù),直到這個(gè)語(yǔ)句或整個(gè)事務(wù)結(jié)束。
(12) UPDLOCK :指定在讀表中數(shù)據(jù)時(shí)設(shè)置更新 鎖(update lock)而不是設(shè)置共享鎖,該鎖一直保持到這個(gè)語(yǔ)句或整個(gè)事務(wù)結(jié)束,使用UPDLOCK的作用是允許用戶先讀取數(shù)據(jù)(而且不阻塞其他用戶讀數(shù)據(jù)),并且保證在后來(lái)再更新數(shù)據(jù)時(shí),這一段時(shí)間內(nèi)這些數(shù)據(jù)沒(méi)有被其他用戶修改。
(本段摘自CSDN博客: http://blog.csdn.NET/zp752963831/archive/2009/02/18/3906477.ASPx)
2. 如何解除表的鎖定,解鎖就是要終止鎖定的那個(gè)鏈接,或者等待該鏈接事務(wù)釋放。
2.1 Activity Monitor
可以通過(guò)Wait Type,Blocked By欄位查看到,SPID 54 被SPID 53 阻塞。 可以右鍵Details查到詳細(xì)的SQL 語(yǔ)句,或Kill掉這個(gè)進(jìn)程。
2.2 SQL Server提供幾個(gè)DMV,查看locks:
sys.dm_exec_requests
sys.dm_tran_locks
sys.dm_os_waiting_tasks
sys.dm_tran_database_transactions
(1)
select * from sys.dm_tran_locks where resource_type<>'DATABASE' --and resource_database_id=DB_ID()
it知識(shí)庫(kù):SQL Server數(shù)據(jù)庫(kù)表鎖定原理以及如何解除表的鎖定,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。