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

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

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

一、 什么是死鎖

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

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

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

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

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

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

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

三、 如何處理死鎖

1) 鎖模式

1.共享鎖(S)

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

2.獨占鎖(X)

對資源獨占的鎖,一個進程獨占地鎖定了請求的數(shù)據(jù)源,那么別的進程無法在此數(shù)據(jù)源上獲得任何類型的鎖。獨占鎖一致持有到事務結束。

3.更新鎖(U)

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

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

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

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

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

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

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

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

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

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

7.鍵范圍鎖

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

SQL SERVER 鎖模式

縮寫

鎖模式

說明

S

Shared

允許其他進程讀取但不能修改鎖定的資源

X

Exclusive

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

U

Update

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

IS

Intent shared

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

IU

Intent update

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

IX

Intent exclusive

表示該資源的一個組件被獨占鎖鎖定了。只有在表或頁級別才能獲得這類鎖

SIX

Shared with intent exclusive

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

SIU

Shared with intent Update

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

UIX

Update with intent exclusive

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

Sch-S

Schema stability

表示一個使用該表的查詢正在被編譯

Sch-M

Schema modification

表示表的結構正在被修改

BU

Bulk Update

在一個大容量復制操作將數(shù)據(jù)導入表中并且(手動或自動)應用了TABLOCK查

詢提示時使用

2) 鎖粒度

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

通過sys.dm_tran_locks視圖可以查看誰被鎖定了(如行,鍵,頁)、鎖的模式以及特定資源的標志符。基于sys.dm_tran_locks視圖創(chuàng)建如下視圖用于查看鎖定的資源以及鎖模式(通過這個視圖可以查看事務鎖定的表、頁、行以及加在數(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) 如何跟蹤死鎖

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

4) 死鎖案例分析

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

5) 如何解決死鎖

針對如上死鎖案例,分析其對應語句執(zhí)行計劃如下:

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

處理方式:

1. 在表上建立一個聚集索引。

2. 對語句更新的相關字段建立包含索引。

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

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

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

四、 如何預防死鎖

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

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

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

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

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

5.使用盡可能低的隔離級別。

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

7.編寫應用程序,讓進程持有鎖的時間盡可能短,這樣其它進程就不必花太長的時間等待鎖被釋放。

相關文章

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

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

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

    一文教會你在MySQL中使用DateTime

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

    在centos7下安裝和部署java8和mysql

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

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

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

    Mysql服務添加 iptables防火墻策略的方案

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

    mysql實現(xiàn)合并結果集并去除重復值

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

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

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

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

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

    探討MySQL 約束下的查詢功能

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

    一文總結使用MySQL時遇到null值的坑

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

最新評論

逊克县| 万全县| 潮安县| 贵州省| 富蕴县| 龙川县| 中阳县| 建水县| 茌平县| 连山| 通城县| 衡东县| 广平县| 灌阳县| 阳原县| 靖安县| 历史| 崇义县| 呈贡县| 丽水市| 石棉县| 平谷区| 六安市| 田林县| 大荔县| 都兰县| 高碑店市| 浦北县| 六枝特区| 彭山县| 邻水| 靖远县| 宁城县| 铁岭县| 东阳市| 康平县| 赤城县| 淳化县| 马公市| 山阳县| 鹤庆县|