国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

SQL Server 鎖

2024-08-31 00:54:19
字體:
供稿:網(wǎng)友
SQL Server 鎖

標(biāo)簽:SQL SERVER/MSSQL SERVER/數(shù)據(jù)庫/死鎖/

鎖資源

Microsoft SQL Server 數(shù)據(jù)庫引擎具有多粒度鎖定,允許一個(gè)事務(wù)鎖定不同類型的資源。 為了盡量減少鎖定的開銷,數(shù)據(jù)庫引擎自動(dòng)將資源鎖定在適合任務(wù)的級(jí)別。 鎖定在較小的粒度(例如行)可以提高并發(fā)度,但開銷較高,因?yàn)槿绻i定了許多行,則需要持有更多的鎖。 鎖定在較大的粒度(例如表)會(huì)降低了并發(fā)度,因?yàn)殒i定整個(gè)表限制了其他事務(wù)對(duì)表中任意部分的訪問。 但其開銷較低,因?yàn)樾枰S護(hù)的鎖較少。

數(shù)據(jù)庫引擎通常必須獲取多粒度級(jí)別上的鎖才能完整地保護(hù)資源。 這組多粒度級(jí)別上的鎖稱為鎖層次結(jié)構(gòu)。 例如,為了完整地保護(hù)對(duì)索引的讀取,數(shù)據(jù)庫引擎實(shí)例可能必須獲取行上的共享鎖以及頁和表上的意向共享鎖。

數(shù)據(jù)庫引擎可以鎖定的資源。

資源說明

RID

用于鎖定堆中的單個(gè)行的行標(biāo)識(shí)符。

KEY

索引中用于保護(hù)可序列化事務(wù)中的鍵范圍的行鎖。

PAGE

數(shù)據(jù)庫中的 8 KB 頁,例如數(shù)據(jù)頁或索引頁。

EXTENT

一組連續(xù)的八頁,例如數(shù)據(jù)頁或索引頁。

HoBT

堆或 B 樹。 用于保護(hù)沒有聚集索引的表中的 B 樹(索引)或堆數(shù)據(jù)頁的鎖。

TABLE

包括所有數(shù)據(jù)和索引的整個(gè)表。

FILE

數(shù)據(jù)庫文件。

application

應(yīng)用程序?qū)S玫馁Y源。

METADATA

元數(shù)據(jù)鎖。

ALLOCATION_UNIT

分配單元。

DATABASE

整個(gè)數(shù)據(jù)庫。

鎖模式

數(shù)據(jù)庫引擎使用的資源鎖模式。

鎖模式說明

共享 (S)

用于不更改或不更新數(shù)據(jù)的讀取操作,如 SELECT 語句。

更新 (U)

用于可更新的資源中。 防止當(dāng)多個(gè)會(huì)話在讀取、鎖定以及隨后可能進(jìn)行的資源更新時(shí)發(fā)生常見形式的死鎖。

排他 (X)

用于數(shù)據(jù)修改操作,例如 INSERT、UPDATE 或 DELETE。 確保不會(huì)同時(shí)對(duì)同一資源進(jìn)行多重更新。

意向

用于建立鎖的層次結(jié)構(gòu)。 意向鎖包含三種類型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。

架構(gòu)

在執(zhí)行依賴于表架構(gòu)的操作時(shí)使用。 架構(gòu)鎖包含兩種類型:架構(gòu)修改 (Sch-M) 和架構(gòu)穩(wěn)定性 (Sch-S)。

大容量更新 (BU)

在向表進(jìn)行大容量數(shù)據(jù)復(fù)制且指定了 TABLOCK 提示時(shí)使用。

鍵范圍

當(dāng)使用可序列化事務(wù)隔離級(jí)別時(shí)保護(hù)查詢讀取的行的范圍。 確保再次運(yùn)行查詢時(shí)其他事務(wù)無法插入符合可序列化事務(wù)的查詢的行。

共享鎖

共享鎖(S 鎖)允許并發(fā)事務(wù)在封閉式并發(fā)控制下讀取 (SELECT) 資源。 有關(guān)詳細(xì)信息,請(qǐng)參閱并發(fā)控制的類型。 資源上存在共享鎖(S 鎖)時(shí),任何其他事務(wù)都不能修改數(shù)據(jù)。 讀取操作一完成,就立即釋放資源上的共享鎖(S 鎖),除非將事務(wù)隔離級(jí)別設(shè)置為可重復(fù)讀或更高級(jí)別,或者在事務(wù)持續(xù)時(shí)間內(nèi)用鎖定提示保留共享鎖(S 鎖)。

更新鎖

更新鎖(U 鎖)可以防止常見的死鎖。 在可重復(fù)讀或可序列化事務(wù)中,此事務(wù)讀取數(shù)據(jù) [獲取資源(頁或行)的共享鎖(S 鎖)],然后修改數(shù)據(jù) [此操作要求鎖轉(zhuǎn)換為排他鎖(X 鎖)]。 如果兩個(gè)事務(wù)獲得了資源上的共享模式鎖,然后試圖同時(shí)更新數(shù)據(jù),則一個(gè)事務(wù)嘗試將鎖轉(zhuǎn)換為排他鎖(X 鎖)。 共享模式到排他鎖的轉(zhuǎn)換必須等待一段時(shí)間,因?yàn)橐粋€(gè)事務(wù)的排他鎖與其他事務(wù)的共享模式鎖不兼容;發(fā)生鎖等待。 第二個(gè)事務(wù)試圖獲取排他鎖(X 鎖)以進(jìn)行更新。 由于兩個(gè)事務(wù)都要轉(zhuǎn)換為排他鎖(X 鎖),并且每個(gè)事務(wù)都等待另一個(gè)事務(wù)釋放共享模式鎖,因此發(fā)生死鎖。

若要避免這種潛在的死鎖問題,請(qǐng)使用更新鎖(U 鎖)。 一次只有一個(gè)事務(wù)可以獲得資源的更新鎖(U 鎖)。 如果事務(wù)修改資源,則更新鎖(U 鎖)轉(zhuǎn)換為排他鎖(X 鎖)。

排他鎖

排他鎖(X 鎖)可以防止并發(fā)事務(wù)對(duì)資源進(jìn)行訪問。 使用排他鎖(X 鎖)時(shí),任何其他事務(wù)都無法修改數(shù)據(jù);僅在使用 NOLOCK 提示或未提交讀隔離級(jí)別時(shí)才會(huì)進(jìn)行讀取操作。

數(shù)據(jù)修改語句(如 INSERT、UPDATE 和 DELETE)合并了修改和讀取操作。 語句在執(zhí)行所需的修改操作之前首先執(zhí)行讀取操作以獲取數(shù)據(jù)。 因此,數(shù)據(jù)修改語句通常請(qǐng)求共享鎖和排他鎖。 例如,UPDATE 語句可能根據(jù)與一個(gè)表的聯(lián)接修改另一個(gè)表中的行。 在此情況下,除了請(qǐng)求更新行上的排他鎖之外,UPDATE 語句還將請(qǐng)求在聯(lián)接表中讀取的行上的共享鎖。

意向鎖

數(shù)據(jù)庫引擎使用意向鎖來保護(hù)共享鎖(S 鎖)或排他鎖(X 鎖)放置在鎖層次結(jié)構(gòu)的底層資源上。 意向鎖之所以命名為意向鎖,是因?yàn)樵谳^低級(jí)別鎖前可獲取它們,因此會(huì)通知意向?qū)㈡i放置在較低級(jí)別上。

意向鎖有兩種用途:

  • 防止其他事務(wù)以會(huì)使較低級(jí)別的鎖無效的方式修改較高級(jí)別資源。
  • 提高數(shù)據(jù)庫引擎在較高的粒度級(jí)別檢測(cè)鎖沖突的效率。

例如,在該表的頁或行上請(qǐng)求共享鎖(S 鎖)之前,在表級(jí)請(qǐng)求共享意向鎖。 在表級(jí)設(shè)置意向鎖可防止另一個(gè)事務(wù)隨后在包含那一頁的表上獲取排他鎖(X 鎖)。 意向鎖可以提高性能,因?yàn)閿?shù)據(jù)庫引擎僅在表級(jí)檢查意向鎖來確定事務(wù)是否可以安全地獲取該表上的鎖。 而不需要檢查表中的每行或每頁上的鎖以確定事務(wù)是否可以鎖定整個(gè)表。

意向鎖包括意向共享 (IS)、意向排他 (IX) 以及意向排他共享 (SIX)。

鎖模式 說明

意向共享 (IS)

保護(hù)針對(duì)層次結(jié)構(gòu)中某些(而并非所有)低層資源請(qǐng)求或獲取的共享鎖。

意向排他 (IX)

保護(hù)針對(duì)層次結(jié)構(gòu)中某些(而并非所有)低層資源請(qǐng)求或獲取的排他鎖。 IX 是 IS 的超集,它也保護(hù)針對(duì)低層級(jí)別資源請(qǐng)求的共享鎖。

意向排他共享 (SIX)

保護(hù)針對(duì)層次結(jié)構(gòu)中某些(而并非所有)低層資源請(qǐng)求或獲取的共享鎖以及針對(duì)某些(而并非所有)低層資源請(qǐng)求或獲取的意向排他鎖。 頂級(jí)資源允許使用并發(fā) IS 鎖。 例如,獲取表上的 SIX 鎖也將獲取正在修改的頁上的意向排他鎖以及修改的行上的排他鎖。 雖然每個(gè)資源在一段時(shí)間內(nèi)只能有一個(gè) SIX 鎖,以防止其他事務(wù)對(duì)資源進(jìn)行更新,但是其他事務(wù)可以通過獲取表級(jí)的 IS 鎖來讀取層次結(jié)構(gòu)中的低層資源。

意向更新 (IU)

保護(hù)針對(duì)層次結(jié)構(gòu)中所有低層資源請(qǐng)求或獲取的更新鎖。 僅在頁資源上使用 IU 鎖。 如果進(jìn)行了更新操作,IU 鎖將轉(zhuǎn)換為 IX 鎖。

共享意向更新 (SIU)

S 鎖和 IU 鎖的組合,作為分別獲取這些鎖并且同時(shí)持有兩種鎖的結(jié)果。 例如,事務(wù)執(zhí)行帶有 PAGLOCK 提示的查詢,然后執(zhí)行更新操作。 帶有 PAGLOCK 提示的查詢將獲取 S 鎖,更新操作將獲取 IU 鎖。

更新意向排他 (UIX)

U 鎖和 IX 鎖的組合,作為分別獲取這些鎖并且同時(shí)持有兩種鎖的結(jié)果。

架構(gòu)鎖

數(shù)據(jù)庫引擎在表數(shù)據(jù)定義語言 (DDL) 操作(例如添加列或刪除表)的過程中使用架構(gòu)修改 (Sch-M) 鎖。 保持該鎖期間,Sch-M 鎖將阻止對(duì)表進(jìn)行并發(fā)訪問。 這意味著 Sch-M 鎖在釋放前將阻止所有外圍操作。

某些數(shù)據(jù)操作語言 (DML) 操作(例如表截?cái)啵┦褂?Sch-M 鎖阻止并發(fā)操作訪問受影響的表。

數(shù)據(jù)庫引擎在編譯和執(zhí)行查詢時(shí)使用架構(gòu)穩(wěn)定性 (Sch-S) 鎖。 Sch-S 鎖不會(huì)阻止某些事務(wù)鎖,其中包括排他 (X) 鎖。 因此,在編譯查詢的過程中,其他事務(wù)(包括那些針對(duì)表使用 X 鎖的事務(wù))將繼續(xù)運(yùn)行。 但是,無法針對(duì)表執(zhí)行獲取 Sch-M 鎖的并發(fā) DDL 操作和并發(fā) DML 操作。

大容量更新鎖

數(shù)據(jù)庫引擎在將數(shù)據(jù)大容量復(fù)制到表中時(shí)使用了大容量更新 (BU) 鎖,并指定了 TABLOCK 提示或使用 sp_tableoption 設(shè)置了 table lock on bulk load 表選項(xiàng)。 大容量更新鎖(BU 鎖)允許多個(gè)線程將數(shù)據(jù)并發(fā)地大容量加載到同一表,同時(shí)防止其他不進(jìn)行大容量加載數(shù)據(jù)的進(jìn)程訪問該表。

鍵范圍鎖

在使用可序列化事務(wù)隔離級(jí)別時(shí),對(duì)于 Transact-SQL 語句讀取的記錄集,鍵范圍鎖可以隱式保護(hù)該記錄集中包含的行范圍。 鍵范圍鎖可防止幻讀。 通過保護(hù)行之間鍵的范圍,它還防止對(duì)事務(wù)訪問的記錄集進(jìn)行幻像插入或刪除

鎖兼容性控制

鎖兼容性控制多個(gè)事務(wù)能否同時(shí)獲取同一資源上的鎖。 如果資源已被另一事務(wù)鎖定,則僅當(dāng)請(qǐng)求鎖的模式與現(xiàn)有鎖的模式相兼容時(shí),才會(huì)授予新的鎖請(qǐng)求。 如果請(qǐng)求鎖的模式與現(xiàn)有鎖的模式不兼容,則請(qǐng)求新鎖的事務(wù)將等待釋放現(xiàn)有鎖或等待鎖超時(shí)間隔過期。 例如,沒有與排他鎖兼容的鎖模式。 如果具有排他鎖(X 鎖),則在釋放排他鎖(X 鎖)之前,其他事務(wù)均無法獲取該資源的任何類型(共享、更新或排他)的鎖。 另一種情況是,如果共享鎖(S 鎖)已應(yīng)用到資源,則即使第一個(gè)事務(wù)尚未完成,其他事務(wù)也可以獲取該項(xiàng)的共享鎖或更新鎖(U 鎖)。 但是,在釋放共享鎖之前,其他事務(wù)無法獲取排他鎖。

最常見的鎖模式的兼容性。

現(xiàn)有授予模式

請(qǐng)求模式

IS

S

U

IX

SIX

X

意向共享 (IS)

共享 (S)

更新 (U)

意向排他 (IX)

意向排他共享 (SIX)

排他 (X)

注意:意向排他鎖(IX 鎖)與 IX 鎖模式兼容,因?yàn)?IX 表示打算只更新部分行而不是所有行。 還允許其他事務(wù)嘗試讀取或更新部分行,只要這些行不是其他事務(wù)當(dāng)前更新的行即可。

使用下表可以確定 Microsoft SQL Server 中所有可用的鎖模式的兼容性。

備注:

作者:pursuer.chen

博客:http://www.cnblogs.com/chenmh

本站點(diǎn)所有隨筆都是原創(chuàng),歡迎大家轉(zhuǎn)載;但轉(zhuǎn)載時(shí)必須注明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責(zé)任的權(quán)利。

《歡迎交流討論》


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 沈阳市| 津市市| 汉川市| 广河县| 遂宁市| 宁阳县| 富平县| 宁阳县| 乌鲁木齐县| 云和县| 集安市| 白河县| 息烽县| 望城县| 兴化市| 女性| 石渠县| 永泰县| 南华县| 乐山市| 金塔县| 尉氏县| 岐山县| 林甸县| 隆昌县| 镇远县| 饶阳县| 阳城县| 太仆寺旗| 泗水县| 德阳市| 汨罗市| 和田县| 汉寿县| 凯里市| 射阳县| 马尔康县| 友谊县| 东源县| 文安县| 利辛县|