最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MSSQL產(chǎn)生死鎖的根本原因及解決方法

 更新時(shí)間:2016年04月01日 11:35:38   作者:產(chǎn)生死鎖的根本原因  
死鎖是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過(guò)程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去.此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等的進(jìn)程稱為死鎖進(jìn)程

一、 什么是死鎖

死鎖是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過(guò)程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去.此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等的進(jìn)程稱為死鎖進(jìn)程.

二、 死鎖產(chǎn)生的四個(gè)必要條件

•互斥條件:指進(jìn)程對(duì)所分配到的資源進(jìn)行排它性使用,即在一段時(shí)間內(nèi)某資源只由一個(gè)進(jìn)程占用。如果此時(shí)還有其它進(jìn)程請(qǐng)求資源,則請(qǐng)求者只能等待,直至占有資源的進(jìn)程用畢釋放

•請(qǐng)求和保持條件:指進(jìn)程已經(jīng)保持至少一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源已被其它進(jìn)程占有,此時(shí)請(qǐng)求進(jìn)程阻塞,但又對(duì)自己已獲得的其它資源保持不放

•不剝奪條件:指進(jìn)程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時(shí)由自己釋放

•環(huán)路等待條件:指在發(fā)生死鎖時(shí),必然存在一個(gè)進(jìn)程——資源的環(huán)形鏈,即進(jìn)程集合{P0,P1,P2,···,Pn}中的P0正在等待一個(gè)P1占用的資源;P1正在等待P2占用的資源,……,Pn正在等待已被P0占用的資源

這四個(gè)條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會(huì)發(fā)生死鎖。

三、 如何處理死鎖

1) 鎖模式

1.共享鎖(S)

由讀操作創(chuàng)建的鎖,防止在讀取數(shù)據(jù)的過(guò)程中,其它事務(wù)對(duì)數(shù)據(jù)進(jìn)行更新;其它事務(wù)可以并發(fā)讀取數(shù)據(jù)。共享鎖可以加在表、頁(yè)、索引鍵或者數(shù)據(jù)行上。在SQL SERVER默認(rèn)隔離級(jí)別下數(shù)據(jù)讀取完畢后就會(huì)釋放共享鎖,但可以通過(guò)鎖提示或設(shè)置更高的事務(wù)隔離級(jí)別改變共享鎖的釋放時(shí)間。

2.獨(dú)占鎖(X)

對(duì)資源獨(dú)占的鎖,一個(gè)進(jìn)程獨(dú)占地鎖定了請(qǐng)求的數(shù)據(jù)源,那么別的進(jìn)程無(wú)法在此數(shù)據(jù)源上獲得任何類型的鎖。獨(dú)占鎖一致持有到事務(wù)結(jié)束。

3.更新鎖(U)

更新鎖實(shí)際上并不是一種獨(dú)立的鎖,而是共享鎖與獨(dú)占鎖的混合。當(dāng)SQL SERVER執(zhí)行數(shù)據(jù)修改操作卻首先需要搜索表以找到需要修改的資源時(shí),會(huì)獲得更新鎖。

更新鎖與共享鎖兼容,但只有一個(gè)進(jìn)程可以獲取當(dāng)前數(shù)據(jù)源上的更新鎖,

其它進(jìn)程無(wú)法獲取該資源的更新鎖或獨(dú)占鎖,更新鎖的作用就好像一個(gè)序列化閥門(serialization gate),將后續(xù)申請(qǐng)獨(dú)占鎖的請(qǐng)求壓入隊(duì)列中。持有更新鎖的進(jìn)程能夠?qū)⑵滢D(zhuǎn)換成該資源上的獨(dú)占鎖。更新鎖不足以用于更新數(shù)據(jù)—實(shí)際的數(shù)據(jù)修改仍需要用到獨(dú)占鎖。對(duì)于獨(dú)占鎖的序列化訪問(wèn)可以避免轉(zhuǎn)換死鎖的發(fā)生,更新鎖會(huì)保留到事務(wù)結(jié)束或者當(dāng)它們轉(zhuǎn)換成獨(dú)占鎖時(shí)為止。

4. 意向鎖(IX,IU,IS)

意向鎖并不是獨(dú)立的鎖定模式,而是一種指出哪些資源已經(jīng)被鎖定的機(jī)制。

如果一個(gè)表頁(yè)上存在獨(dú)占鎖,那么另一個(gè)進(jìn)程就無(wú)法獲得該表上的共享表鎖,這種層次關(guān)系是用意向鎖來(lái)實(shí)現(xiàn)的。進(jìn)程要獲得獨(dú)占頁(yè)鎖、更新頁(yè)鎖或意向獨(dú)占頁(yè)鎖,首先必須獲得該表上的意向獨(dú)占鎖。同理,進(jìn)程要獲得共享行鎖,必須首先獲得該表的意向共享鎖,以防止別的進(jìn)程獲得獨(dú)占表鎖。

5. 特殊鎖模式(Sch_s,Sch_m,BU)

SQL SERVER提供3種額外的鎖模式:架構(gòu)穩(wěn)定鎖、架構(gòu)修改鎖、大容量更新鎖。

6.轉(zhuǎn)換鎖(SIX,SIU,UIX)

轉(zhuǎn)換鎖不會(huì)由SQL SERVER 直接請(qǐng)求,而是從一種模式轉(zhuǎn)換到另一種模式所造成的。SQL SERVER 2008支持3種類型的轉(zhuǎn)換鎖:SIX、SIU、UIX.其中最常見的是SIX鎖,如果事務(wù)持有一個(gè)資源上的共享鎖(S),然后又需要一個(gè)IX鎖,此時(shí)就會(huì)出現(xiàn)SIX。

7.鍵范圍鎖

鍵范圍鎖是在可序列化隔離級(jí)別中鎖定一定范圍內(nèi)數(shù)據(jù)的鎖。保證在查詢數(shù)據(jù)的鍵范圍內(nèi)不允許插入數(shù)據(jù)。

SQL SERVER 鎖模式

縮寫

鎖模式

說(shuō)明

S

Shared

允許其他進(jìn)程讀取但不能修改鎖定的資源

X

Exclusive

防止別的進(jìn)程讀取或者修改鎖定資源中的數(shù)據(jù)

U

Update

防止其它進(jìn)程獲取更新鎖或獨(dú)占鎖;在搜索要修改的數(shù)據(jù)時(shí)使用

IS

Intent shared

表示該資源的一個(gè)組件被共享鎖鎖定了。只有在表或頁(yè)級(jí)別才能獲得這類鎖

IU

Intent update

表示該資源的一個(gè)組件被更新鎖鎖定了。只有在表或頁(yè)級(jí)別才能獲得這類鎖

IX

Intent exclusive

表示該資源的一個(gè)組件被獨(dú)占鎖鎖定了。只有在表或頁(yè)級(jí)別才能獲得這類鎖

SIX

Shared with intent exclusive

表示一個(gè)正持有共享鎖的資源還有一個(gè)組件(一頁(yè)或一行)被獨(dú)占鎖鎖定了

SIU

Shared with intent Update

表示一個(gè)正持有共享鎖的資源還有一個(gè)組件(一頁(yè)或一行)被更新鎖鎖定了

UIX

Update with intent exclusive

表示一個(gè)正持有更新鎖的資源還有一個(gè)組件(一頁(yè)或一行)被獨(dú)占鎖鎖定了

Sch-S

Schema stability

表示一個(gè)使用該表的查詢正在被編譯

Sch-M

Schema modification

表示表的結(jié)構(gòu)正在被修改

BU

Bulk Update

在一個(gè)大容量復(fù)制操作將數(shù)據(jù)導(dǎo)入表中并且(手動(dòng)或自動(dòng))應(yīng)用了TABLOCK查

詢提示時(shí)使用

2) 鎖粒度

SQL SERVER 可以在表、頁(yè)、行等級(jí)別鎖定用戶的數(shù)據(jù)資源即非系統(tǒng)資源(系統(tǒng)資源是用閂鎖來(lái)保護(hù)的)。此外SQL SERVER 還可以鎖定索引鍵和索引鍵范圍。

通過(guò)sys.dm_tran_locks視圖可以查看誰(shuí)被鎖定了(如行,鍵,頁(yè))、鎖的模式以及特定資源的標(biāo)志符?;趕ys.dm_tran_locks視圖創(chuàng)建如下視圖用于查看鎖定的資源以及鎖模式(通過(guò)這個(gè)視圖可以查看事務(wù)鎖定的表、頁(yè)、行以及加在數(shù)據(jù)資源上的鎖類型)。

CREATE VIEW dblocks AS 
SELECT request_session_id AS spid, 
DB_NAME(resource_database_id) AS dbname, 
CASE WHEN resource_type='object' 
THEN OBJECT_NAME(resource_associated_entity_id) 
WHEN resource_associated_entity_id=0 THEN 'n/a' 
ELSE OBJECT_NAME(p.object_id) END AS entity_name, 
index_id, 
resource_type AS RESOURCE, 
resource_description AS DESCRIPTION, 
request_mode AS mode, 
request_status AS STATUS 
FROM sys.dm_tran_locks t LEFT JOIN sys.partitions p ON p.partition_id=t.resource_associated_entity_id 
WHERE resource_database_id=DB_ID()

3) 如何跟蹤死鎖

通過(guò)選擇sql server profiler 事件中的如下選項(xiàng)就可以跟蹤到死鎖產(chǎn)生的相關(guān)語(yǔ)句。

4) 死鎖案例分析

在該案例中process65db88, process1d0045948為語(yǔ)句1的進(jìn)程,process629dc8 為語(yǔ)句2的進(jìn)程; 語(yǔ)句2獲取了1689766頁(yè)上的更新鎖,在等待1686247頁(yè)上的更新鎖;而語(yǔ)句1則獲取了1686247頁(yè)上的更新鎖在等待1689766頁(yè)上的更新鎖,兩個(gè)語(yǔ)句等待的資源形成了一個(gè)環(huán)路,造成死鎖。

5) 如何解決死鎖

針對(duì)如上死鎖案例,分析其對(duì)應(yīng)語(yǔ)句執(zhí)行計(jì)劃如下:

通過(guò)執(zhí)行計(jì)劃可以看出,在查找需要更新的數(shù)據(jù)時(shí)使用的是索引掃描,比較耗費(fèi)性能,這樣就造成鎖定資源時(shí)間過(guò)長(zhǎng),增加了語(yǔ)句并發(fā)執(zhí)行時(shí)產(chǎn)生死鎖的概率。

處理方式:

1. 在表上建立一個(gè)聚集索引。

2. 對(duì)語(yǔ)句更新的相關(guān)字段建立包含索引。

優(yōu)化后該語(yǔ)句執(zhí)行計(jì)劃如下:

優(yōu)化后的執(zhí)行計(jì)劃使用了索引查找,將大幅提升該查詢語(yǔ)句的性能,降低了鎖定資源的時(shí)間,同時(shí)也減少了鎖定資源的范圍,這樣就降低了鎖資源循環(huán)等待事件發(fā)生的概率,對(duì)于預(yù)防死鎖的發(fā)生會(huì)有一定的作用。

死鎖是無(wú)法完全避免的,但如果應(yīng)用程序適當(dāng)處理死鎖,對(duì)涉及的任何用戶及系統(tǒng)其余部分的影響可降至最低(適當(dāng)處理是指發(fā)生錯(cuò)誤1205時(shí),應(yīng)用程序重新提交批處理,第二次嘗試大多能成功。一個(gè)進(jìn)程被殺死,它的事務(wù)被取消,它的鎖被釋放,死鎖中涉及到的另一個(gè)進(jìn)程就可以完成它的工作并釋放鎖,所以就不具備產(chǎn)生另一個(gè)死鎖的條件了。)

四、 如何預(yù)防死鎖

阻止死鎖的途徑就是避免滿足死鎖條件的情況發(fā)生,為此我們?cè)陂_發(fā)的過(guò)程中需要遵循如下原則:

1.盡量避免并發(fā)的執(zhí)行涉及到修改數(shù)據(jù)的語(yǔ)句。

2.要求每一個(gè)事務(wù)一次就將所有要使用到的數(shù)據(jù)全部加鎖,否則就不允許執(zhí)行。

3.預(yù)先規(guī)定一個(gè)加鎖順序,所有的事務(wù)都必須按照這個(gè)順序?qū)?shù)據(jù)執(zhí)行封鎖。如不同的過(guò)程在事務(wù)內(nèi)部對(duì)對(duì)象的更新執(zhí)行順序應(yīng)盡量保證一致。

4.每個(gè)事務(wù)的執(zhí)行時(shí)間不可太長(zhǎng),對(duì)程序段的事務(wù)可考慮將其分割為幾個(gè)事務(wù)。在事務(wù)中不要求輸入,應(yīng)該在事務(wù)之前得到輸入,然后快速執(zhí)行事務(wù)。

5.使用盡可能低的隔離級(jí)別。

6.數(shù)據(jù)存儲(chǔ)空間離散法。該方法是指采用各種手段,將邏輯上在一個(gè)表中的數(shù)據(jù)分散的若干離散的空間上去,以便改善對(duì)表的訪問(wèn)性能。主要通過(guò)將大表按行或者列分解為若干小表,或者按照不同的用戶群兩種方法實(shí)現(xiàn)。

7.編寫應(yīng)用程序,讓進(jìn)程持有鎖的時(shí)間盡可能短,這樣其它進(jìn)程就不必花太長(zhǎng)的時(shí)間等待鎖被釋放。

相關(guān)文章

  • 淺析Mysql 中如何導(dǎo)出數(shù)據(jù)

    淺析Mysql 中如何導(dǎo)出數(shù)據(jù)

    MySQL中你可以使用SELECT…INTO OUTFILE語(yǔ)句來(lái)簡(jiǎn)單的導(dǎo)出數(shù)據(jù)到文本文件上,這篇文章給大家介紹了Mysql 中如何導(dǎo)出數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • 一文教會(huì)你在MySQL中使用DateTime

    一文教會(huì)你在MySQL中使用DateTime

    mysql數(shù)據(jù)庫(kù)在我們的工作中經(jīng)常需要使用,經(jīng)常在表中需要使用時(shí)間,下面這篇文章主要給大家介紹了關(guān)于在MySQL中使用DateTime的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 在centos7下安裝和部署java8和mysql

    在centos7下安裝和部署java8和mysql

    一般學(xué)習(xí)java和部署項(xiàng)目都是在本地部署,但是生產(chǎn)環(huán)境一般都是在linux環(huán)境下,部署和安裝環(huán)境都是在控制臺(tái)下進(jìn)行操作的,沒有windows的可視化的操作界面,對(duì)與linux的命令掌握和操作對(duì)小白來(lái)說(shuō)都是一個(gè)個(gè)挑戰(zhàn),記錄下自己的安裝配置過(guò)程
    2017-04-04
  • mysql 5.7.17 免安裝版配置方法圖文教程(windows10)

    mysql 5.7.17 免安裝版配置方法圖文教程(windows10)

    這篇文章主要為大家詳細(xì)介紹了windows10下mysql 5.7.17 免安裝版配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Mysql服務(wù)添加 iptables防火墻策略的方案

    Mysql服務(wù)添加 iptables防火墻策略的方案

    這篇文章主要介紹了給Mysql服務(wù)添加 iptables防火墻策略的方案,本文給大家分享兩種解決方案,需要的朋友可以參考下
    2021-04-04
  • mysql實(shí)現(xiàn)合并結(jié)果集并去除重復(fù)值

    mysql實(shí)現(xiàn)合并結(jié)果集并去除重復(fù)值

    這篇文章主要介紹了mysql實(shí)現(xiàn)合并結(jié)果集并去除重復(fù)值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 使用prometheus統(tǒng)計(jì)MySQL自增主鍵的剩余可用百分比

    使用prometheus統(tǒng)計(jì)MySQL自增主鍵的剩余可用百分比

    這篇文章主要介紹了使用prometheus統(tǒng)計(jì)MySQL自增主鍵的剩余可用百分比,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 在SQL中獲取一個(gè)長(zhǎng)字符串中某個(gè)字符串出現(xiàn)次數(shù)的實(shí)現(xiàn)方法

    在SQL中獲取一個(gè)長(zhǎng)字符串中某個(gè)字符串出現(xiàn)次數(shù)的實(shí)現(xiàn)方法

    以下是對(duì)在SQL中獲取一個(gè)長(zhǎng)字符串中某個(gè)字符串出現(xiàn)次數(shù)的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
    2013-07-07
  • 探討MySQL 約束下的查詢功能

    探討MySQL 約束下的查詢功能

    這篇文章主要介紹了探討MySQL 約束下的查詢功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • 一文總結(jié)使用MySQL時(shí)遇到null值的坑

    一文總結(jié)使用MySQL時(shí)遇到null值的坑

    這篇文章給大家總結(jié)了日常使用MySQL時(shí),容易遇到NULL值的坑有哪些,文章通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

开封县| 桐乡市| 称多县| 香港| 沭阳县| 洪泽县| 塘沽区| 同德县| 肇州县| 武强县| 乐业县| 潜江市| 三都| 景洪市| 扶绥县| 高要市| 渝北区| 永康市| 丰台区| 澎湖县| 年辖:市辖区| 陇川县| 色达县| 东莞市| 友谊县| 乌拉特前旗| 郯城县| 永昌县| 望江县| 黄陵县| 梅河口市| 乐至县| 盖州市| 阳新县| 若尔盖县| 伊吾县| 金湖县| 普陀区| 景德镇市| 沂水县| 邵东县|