日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

数据库死锁及解决办法

發(fā)布時(shí)間:2023/12/29 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库死锁及解决办法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 1. 事務(wù)之間對(duì)資源訪問(wèn)順序的交替
  • 2. 并發(fā)修改同一記錄
  • 3. 索引不當(dāng)導(dǎo)致的死鎖

目前,我們已經(jīng)探討了許多關(guān)于數(shù)據(jù)庫(kù)鎖的問(wèn)題,鎖能夠有效地解決并發(fā)的問(wèn)題,但這也帶來(lái)了一個(gè)嚴(yán)重的缺點(diǎn),那就是死鎖。

死鎖在操作系統(tǒng)中指的是兩個(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)程。

在操作系統(tǒng)中,死鎖的處理是一個(gè)重要的話題,也已經(jīng)有較為成熟的解決方法,如銀行家算法等,在這邊我們就不再闡述,只討論數(shù)據(jù)庫(kù)中的死鎖。

數(shù)據(jù)庫(kù)中常見(jiàn)的死鎖原因與解決方案有:

1. 事務(wù)之間對(duì)資源訪問(wèn)順序的交替

出現(xiàn)原因:
一個(gè)用戶A 訪問(wèn)表A(鎖住了表A),然后又訪問(wèn)表B;另一個(gè)用戶B 訪問(wèn)表B(鎖住了表B),然后企圖訪問(wèn)表A;這時(shí)用戶A由于用戶B已經(jīng)鎖住表B,它必須等待用戶B釋放表B才能繼續(xù),同樣用戶B要等用戶A釋放表A才能繼續(xù),這就死鎖就產(chǎn)生了。

解決方法:
這種死鎖比較常見(jiàn),是由于程序的BUG產(chǎn)生的,除了調(diào)整的程序的邏輯沒(méi)有其它的辦法。仔細(xì)分析程序的邏輯,對(duì)于數(shù)據(jù)庫(kù)的多表操作時(shí),盡量按照相同的順序進(jìn)行處理,盡量避免同時(shí)鎖定兩個(gè)資源,如操作A和B兩張表時(shí),總是按先A后B的順序處理, 必須同時(shí)鎖定兩個(gè)資源時(shí),要保證在任何時(shí)刻都應(yīng)該按照相同的順序來(lái)鎖定資源

2. 并發(fā)修改同一記錄

出現(xiàn)原因:主要是由于沒(méi)有一次性申請(qǐng)夠權(quán)限的鎖導(dǎo)致的。參考:記錄一次死鎖排查過(guò)程

用戶A查詢一條紀(jì)錄,然后修改該條紀(jì)錄;這時(shí)用戶B修改該條紀(jì)錄,這時(shí)用戶A的事務(wù)里鎖的性質(zhì)由查詢的共享鎖企圖上升到獨(dú)占鎖,而用戶B里的獨(dú)占鎖由于A有共享鎖存在所以必須等A釋放掉共享鎖,而A由于B的獨(dú)占鎖而無(wú)法上升的獨(dú)占鎖也就不可能釋放共享鎖,于是出現(xiàn)了死鎖。這種死鎖比較隱蔽,但在稍大點(diǎn)的項(xiàng)目中經(jīng)常發(fā)生。

解決方法:

a. 樂(lè)觀鎖,實(shí)現(xiàn)寫(xiě)-寫(xiě)并發(fā)

b. 悲觀鎖:使用悲觀鎖進(jìn)行控制。悲觀鎖大多數(shù)情況下依靠數(shù)據(jù)庫(kù)的鎖機(jī)制實(shí)現(xiàn),如Oracle的Select … for update語(yǔ)句,以保證操作最大程度的獨(dú)占性。但隨之而來(lái)的就是數(shù)據(jù)庫(kù)性能的大量開(kāi)銷,特別是對(duì)長(zhǎng)事務(wù)而言,這樣的開(kāi)銷往往無(wú)法承受。

3. 索引不當(dāng)導(dǎo)致的死鎖

出現(xiàn)原因:
如果在事務(wù)中執(zhí)行了一條不滿足條件的語(yǔ)句,執(zhí)行全表掃描,把行級(jí)鎖上升為表級(jí)鎖,多個(gè)這樣的事務(wù)執(zhí)行后,就很容易產(chǎn)生死鎖和阻塞。類似的情況還有當(dāng)表中的數(shù)據(jù)量非常龐大而索引建的過(guò)少或不合適的時(shí)候,使得經(jīng)常發(fā)生全表掃描,最終應(yīng)用系統(tǒng)會(huì)越來(lái)越慢,最終發(fā)生阻塞或死鎖。

另外一種情況是由于二級(jí)索引的存在,上鎖的順序不同導(dǎo)致的,這部分在討論索引時(shí)會(huì)提到。參考:https://www.cnblogs.com/LBSer/p/5183300.html

解決方法:

SQL語(yǔ)句中不要使用太復(fù)雜的關(guān)聯(lián)多表的查詢;使用“執(zhí)行計(jì)劃”對(duì)SQL語(yǔ)句進(jìn)行分析,對(duì)于有全表掃描的SQL語(yǔ)句,建立相應(yīng)的索引進(jìn)行優(yōu)化。

那么,如何盡可能的避免死鎖呢?

1)以固定的順序訪問(wèn)表和行。即按順序申請(qǐng)鎖,這樣就不會(huì)造成互相等待的場(chǎng)面。

2)大事務(wù)拆小。大事務(wù)更傾向于死鎖,如果業(yè)務(wù)允許,將大事務(wù)拆小。

3)在同一個(gè)事務(wù)中,盡可能做到一次鎖定所需要的所有資源,減少死鎖概率。

4)降低隔離級(jí)別。如果業(yè)務(wù)允許,將隔離級(jí)別調(diào)低也是較好的選擇,比如將隔離級(jí)別從RR調(diào)整為RC,可以避免掉很多因?yàn)間ap鎖造成的死鎖。

5)為表添加合理的索引。如果不走索引將會(huì)為表的每一行記錄添加上鎖,死鎖的概率大大增大。

總結(jié)

以上是生活随笔為你收集整理的数据库死锁及解决办法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。