Microsoft SQL Server鎖模式的正確應(yīng)用
以下的文章講述的是Microsoft SQL Server鎖模式,在SQL Server數(shù)據(jù)庫中加鎖的實(shí)際操作過程中除了可以對(duì)一些資源進(jìn)行加鎖,同時(shí)還可以使用不同程度的加鎖方式,即鎖有多種模式,SQL Server中鎖模式包括:
1.共享鎖 SQL Server中,共享鎖用于所有的只讀數(shù)據(jù)操作。共享鎖是非獨(dú)占的,允許多個(gè)并發(fā)事務(wù)讀取其鎖定的資源。默認(rèn)情況下,數(shù)據(jù)被讀取后,SQL Server立即釋放共享鎖。例如,執(zhí)行查詢“SELECT * FROM AUTHORS”時(shí),首先鎖定***頁,讀取之后,釋放對(duì)***頁的鎖定,然后鎖定第二頁。
這樣,就允許在讀操作過程中,修改未被鎖定的***頁。但是,事務(wù)隔離級(jí)別連接選項(xiàng)設(shè)置和SELECT語句中的鎖定設(shè)置都可以改變SQL Server的這種默認(rèn)設(shè)置。例如,“ SELECT * FROM AUTHORS HOLDLOCK”就要求在整個(gè)查詢過程中,保持對(duì)表的鎖定,直到查詢完成才釋放鎖定。
2.更新鎖 更新鎖在修改操作的初始化階段用來鎖定可能要被修改的資源,這樣可以避免使用共享鎖造成的死鎖現(xiàn)象。因?yàn)槭褂霉蚕礞i時(shí),修改數(shù)據(jù)的操作分為兩步,首先獲得一個(gè)共享鎖,讀取數(shù)據(jù),然后將共享鎖升級(jí)為排它鎖,然后再執(zhí)行修改操作。
這樣如果同時(shí)有兩個(gè)或多個(gè)事務(wù)同時(shí)對(duì)一個(gè)事務(wù)申請了共享鎖,在修改數(shù)據(jù)的時(shí)候,這些事務(wù)都要將共享鎖升級(jí)為排它鎖。這時(shí),這些事務(wù)都不會(huì)釋放共享鎖而是一直等待對(duì)方釋放,這樣就造成了死鎖。如果一個(gè)數(shù)據(jù)在修改前直接申請更新鎖,在數(shù)據(jù)修改的時(shí)候再升級(jí)為排它鎖,就可以避免死鎖。
3.排它鎖 排它鎖是為修改數(shù)據(jù)而保留的。它所鎖定的資源,其他事務(wù)不能讀取也不能修改。
4.結(jié)構(gòu)鎖 執(zhí)行表的數(shù)據(jù)定義語言 (DDL) 操作(例如添加列或除去表)時(shí)使用架構(gòu)修改 (Sch-M) 鎖。當(dāng)編譯查詢時(shí),使用架構(gòu)穩(wěn)定性 (Sch-S) 鎖。架構(gòu)穩(wěn)定性 (Sch-S) 鎖不阻塞任何事務(wù)鎖,包括排它鎖。因此在編譯查詢時(shí),其它事務(wù)(包括在表上有排它鎖的事務(wù))都能繼續(xù)運(yùn)行。但不能在表上執(zhí)行 DDL 操作。
5.意向鎖 意向鎖說明SQL Server有在資源的低層獲得共享鎖或排它鎖的意向。例如,表級(jí)的共享意向鎖說明事務(wù)意圖將排它鎖釋放到表中的頁或者行。意向鎖又可以分為共享意向鎖、獨(dú)占意向鎖和共享式獨(dú)占意向鎖。
共享意向鎖說明事務(wù)意圖在共享意向鎖所鎖定的低層資源上放置共享鎖來讀取數(shù)據(jù)。獨(dú)占意向鎖說明事務(wù)意圖在共享意向鎖所鎖定的低層資源上放置排它鎖來修改數(shù)據(jù)。共享式排它鎖說明事務(wù)允許其他事務(wù)使用共享鎖來讀取頂層資源,并意圖在該資源低層上放置排它鎖。
6.大容量更新鎖 當(dāng)將數(shù)據(jù)大容量復(fù)制到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 設(shè)置了 table lock on bulk 表選項(xiàng)時(shí),將使用大容量更新 鎖。大容量更新鎖允許進(jìn)程將數(shù)據(jù)并發(fā)地大容量復(fù)制到同一表,同時(shí)防止其它不進(jìn)行大容量復(fù)制數(shù)據(jù)的進(jìn)程訪問該表。
上述的相關(guān)內(nèi)容就是對(duì)Microsoft SQL Server鎖模式的描述,希望會(huì)給你帶來一些幫助在此方面。
【編輯推薦】