您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(guān)數(shù)據(jù)庫deadlock的類型有哪些,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
根據(jù)微軟聯(lián)機叢書,死鎖的類型如下:
共享鎖 共享鎖(S 鎖)允許并發(fā)事務在封閉式并發(fā)控制下讀取 (SELECT) 資源。資源上存在共享鎖(S 鎖)時,任何其他事務都不能修改數(shù)據(jù)。讀取操作一完成,就立即釋放資源上的共享鎖(S 鎖),除非將事務隔離級別設置為可重復讀或更高級別,或者在事務持續(xù)時間內(nèi)用鎖定提示保留共享鎖(S 鎖)。
更新鎖 更新鎖(U 鎖)可以防止常見的死鎖。在可重復讀或可序列化事務中,此事務讀取數(shù)據(jù) [獲取資源(頁或行)的共享鎖(S 鎖)],然后修改數(shù)據(jù) [此操作要求鎖轉(zhuǎn)換為排他鎖(X 鎖)]。如果兩個事務獲得了資源上的共享模式鎖,然后試圖同時更新數(shù)據(jù),則一個事務嘗試將鎖轉(zhuǎn)換為排他鎖(X 鎖)。共享模式到排他鎖的轉(zhuǎn)換必須等待一段時間,因為一個事務的排他鎖與其他事務的共享模式鎖不兼容;發(fā)生鎖等待。第二個事務試圖獲取排他鎖(X 鎖)以進行更新。由于兩個事務都要轉(zhuǎn)換為排他鎖(X 鎖),并且每個事務都等待另一個事務釋放共享模式鎖,因此發(fā)生死鎖。若要避免這種潛在的死鎖問題,請使用更新鎖(U 鎖)。一次只有一個事務可以獲得資源的更新鎖(U 鎖)。如果事務修改資源,則更新鎖(U 鎖)轉(zhuǎn)換為排他鎖(X 鎖)。
排他鎖 排他鎖(X 鎖)可以防止并發(fā)事務對資源進行訪問。使用排他鎖(X 鎖)時,任何其他事務都無法修改數(shù)據(jù);僅在使用 NOLOCK 提示或未提交讀隔離級別時才會進行讀取操作。數(shù)據(jù)修改語句(如 INSERT、UPDATE 和 DELETE)合并了修改和讀取操作。語句在執(zhí)行所需的修改操作之前首先執(zhí)行讀取操作以獲取數(shù)據(jù)。因此,數(shù)據(jù)修改語句通常請求共享鎖和排他鎖。例如,UPDATE 語句可能根據(jù)與一個表的聯(lián)接修改另一個表中的行。在此情況下,除了請求更新行上的排他鎖之外,UPDATE 語句還將請求在聯(lián)接表中讀取的行上的共享鎖。
意向鎖 數(shù)據(jù)庫引擎使用意向鎖來保護共享鎖(S 鎖)或排他鎖(X 鎖)放置在鎖層次結(jié)構(gòu)的底層資源上。意向鎖之所以命名為意向鎖,是因為在較低級別鎖前可獲取它們,因此會通知意向?qū)㈡i放置在較低級別上。意向鎖有兩種用途:
防止其他事務以會使較低級別的鎖無效的方式修改較高級別資源。
提高數(shù)據(jù)庫引擎在較高的粒度級別檢測鎖沖突的效率。
例如,在該表的頁或行上請求共享鎖(S 鎖)之前,在表級請求共享意向鎖。在表級設置意向鎖可防止另一個事務隨后在包含那一頁的表上獲取排他鎖(X 鎖)。意向鎖可以提高性能,因為數(shù)據(jù)庫引擎僅在表級檢查意向鎖來確定事務是否可以安全地獲取該表上的鎖。而不需要檢查表中的每行或每頁上的鎖以確定事務是否可以鎖定整個表。意向鎖包括意向共享 (IS)、意向排他 (IX) 以及意向排他共享 (SIX)。
意向共享 (IS) 保護針對層次結(jié)構(gòu)中某些(而并非所有)低層資源請求或獲取的共享鎖。
意向排他 (IX) 保護針對層次結(jié)構(gòu)中某些(而并非所有)低層資源請求或獲取的排他鎖。IX 是 IS 的超集,它也保護針對低層級別資源請求的共享鎖。
意向排他共享 (SIX) 保護針對層次結(jié)構(gòu)中某些(而并非所有)低層資源請求或獲取的共享鎖以及針對某些(而并非所有)低層資源請求或獲取的意向排他鎖。頂級資源允許使用并發(fā) IS 鎖。例如,獲取表上的 SIX 鎖也將獲取正在修改的頁上的意向排他鎖以及修改的行上的排他鎖。雖然每個資源在一段時間內(nèi)只能有一個 SIX 鎖,以防止其他事務對資源進行更新,但是其他事務可以通過獲取表級的 IS 鎖來讀取層次結(jié)構(gòu)中的低層資源。
意向更新 (IU) 保護針對層次結(jié)構(gòu)中所有低層資源請求或獲取的更新鎖。僅在頁資源上使用 IU 鎖。如果進行了更新操作,IU 鎖將轉(zhuǎn)換為 IX 鎖。
共享意向更新 (SIU) S 鎖和 IU 鎖的組合,作為分別獲取這些鎖并且同時持有兩種鎖的結(jié)果。例如,事務執(zhí)行帶有 PAGLOCK 提示的查詢,然后執(zhí)行更新操作。帶有 PAGLOCK 提示的查詢將獲取 S 鎖,更新操作將獲取 IU 鎖。
更新意向排他 (UIX) U 鎖和 IX 鎖的組合,作為分別獲取這些鎖并且同時持有兩種鎖的結(jié)果。
架構(gòu)鎖 數(shù)據(jù)庫引擎在表數(shù)據(jù)定義語言 (DDL) 操作(例如添加列或刪除表)的過程中使用架構(gòu)修改 (Sch-M) 鎖。保持該鎖期間,Sch-M 鎖將阻止對表進行并發(fā)訪問。這意味著 Sch-M 鎖在釋放前將阻止所有外圍操作。某些數(shù)據(jù)操作語言 (DML) 操作(例如表截斷)使用 Sch-M 鎖阻止并發(fā)操作訪問受影響的表。數(shù)據(jù)庫引擎在編譯和執(zhí)行查詢時使用架構(gòu)穩(wěn)定性 (Sch-S) 鎖。Sch-S 鎖不會阻止某些事務鎖,其中包括排他 (X) 鎖。因此,在編譯查詢的過程中,其他事務(包括那些針對表使用 X 鎖的事務)將繼續(xù)運行。但是,無法針對表執(zhí)行獲取 Sch-M 鎖的并發(fā) DDL 操作和并發(fā) DML 操作。
大容量更新鎖 數(shù)據(jù)庫引擎在將數(shù)據(jù)大容量復制到表中時使用了大容量更新 (BU) 鎖,并指定了 TABLOCK 提示或使用 sp_tableoption 設置了 table lock on bulk load 表選項。大容量更新鎖(BU 鎖)允許多個線程將數(shù)據(jù)并發(fā)地大容量加載到同一表,同時防止其他不進行大容量加載數(shù)據(jù)的進程訪問該表。
鍵范圍鎖 在使用可序列化事務隔離級別時,對于 Transact-SQL 語句讀取的記錄集,鍵范圍鎖可以隱式保護該記錄集中包含的行范圍。鍵范圍鎖可防止幻讀。通過保護行之間鍵的范圍,它還防止對事務訪問的記錄集進行幻像插入或刪除。
關(guān)于數(shù)據(jù)庫deadlock的類型有哪些就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。