亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL阻塞與死鎖的解決

 更新時間:2023年09月07日 14:40:40   作者:柒間  
本文主要介紹了MySQL阻塞與死鎖的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

阻塞

因為不同鎖之間的兼容性關系,在有些時刻一個事務中的鎖需要等待另一個事務中的鎖釋放它所占用的資源,這就是阻塞。

# 查看等待時間
show variables like 'innodb_lock_wait_timeout';
SET@@innodb_lock_wait_timeout=60;
# 是否在等待超時時對進行中的事務進行回滾操作
show variables like 'innodb_rollback_on_timeout';
#設置等待時間  默認50秒
SET@@innodb_lock_wait_timeout=60;  
#設置是否在等待超時時對進行中的事務進行回滾操作  默認是OFF 代表不回滾
SET@@innodb_rollback_on_timeout=on;

查詢:

image-20230814102157758

設置值:

image-20230815165901211

注意:參數 innodb_lock_wait_timeout 參數是動態(tài)的,在mysql運行時可進行調整, innodb_rollback_on_timeout 參數是靜態(tài)的,不可在運行時進行修改,否則會報錯。

需要特別注意:在默認情況下InnoDB存儲引擎不會回滾超時引發(fā)的錯誤異常。(其實InnoDB存儲引擎在大部分情況下都不會對異常進行回滾。)

異常實例演示:

左邊為會話A,右邊為會話B。初始狀態(tài)數據庫表film中有3條數據,ID,分別為3,5,6;

首先會話A 開啟了事務A,并且在Next-Key Lock算法下鎖定了小與5包含5的記錄。事務B正常插入記錄ID:7,當插入ID:4 時就進人阻塞狀態(tài)了

image-20230815174128914

當事務B達到事務超時間時間時,報錯 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction .

image-20230815174608612

這時事務B在此查詢會發(fā)現,**ID:7 這條記錄依然存在,這是因為事務B雖然拋出了異常,但是既沒有進行commit 操作也沒有進行 rollback操作。**這是非常危險的,因為此時數據庫一致性特性被打破了。因此此時用戶必須判斷是否需要COMMIT還是ROLLBACK,之后再進行下一步的操作。

image-20230815175103979

一般情況這時事務B需要進行 rollback操作,具體情況具體分析。

image-20230815175620413

死鎖

死鎖是指兩個或兩個以上的事務在執(zhí)行過程中,因爭奪鎖資源而造成的一種互相等待的現象。

當發(fā)生死鎖的時候,若無外力作用事務都將無法進行下去。

死鎖產生的條件:

  • 互斥條件
    臨界資源是獨占資源,進程應互斥且排他的使用這些資源。
  • 占有和等待條件
    進程在請求資源得不到滿足而等待時,不釋放已占有資源。
  • 不剝奪條件
    又稱不可搶占,已獲資源只能由進程自愿釋放,不允許被其他進程剝奪。
  • 循環(huán)等待條件
    又稱環(huán)路條件,存在循環(huán)等待鏈,其中,每個進程都在等待鏈中等待下一個進程所持有的資源,造成這組進程處于永遠等待狀態(tài)。

如何解決死鎖問題:

1.超時機制:當兩個事務互相等待時,如果等待時間超過設置的某一閾值時,其中一個事務進行回滾,另一個等待的事務就能繼續(xù)進行。在InnoDB存儲引擎中, innodb_lock_wait_timeout 設置超時的時間。

我們知道,一條記錄是有很多undo log的或者undo 版本鏈有很多版本的,如果一個事務操作更新了很多行,這時候如果要進行回滾所占用的時間可能就會很多。

2.使用wai t-for graph (等待圖)進行死鎖檢測,數據庫需要保存鎖的信息鏈表和事務等待鏈表。我們通過鎖的信息鏈表和事務等待鏈表就可以構造出一張圖,如果圖中存在回路那就說明出現了死鎖。

image-20230815235528149

? 事務和鎖狀態(tài)圖

上圖中,transaction wait list 中有四個事務,事務t2對row1加了x鎖,事務t1對row1加了s鎖,并且事務t1需要等待事務t2中的row1資源,因此wait-for graph圖中有一條邊沖節(jié)點t1指向t2。 row2記錄的情況同理。

image-20230816001239711

? wait-for graph

觀察發(fā)現,t1 和 t2 存在回路,因此存在死鎖。

閱讀到這里,我們需要意識到因為MySQL數據庫是一個并發(fā)的程序,所以才存在死鎖。因為如果程序是串行的,那么也就不會發(fā)生死鎖了。

死鎖示例:

有兩個事務A,B: 事務A當前讀查詢記錄ID:5 ,事務B當前讀查詢ID:6。

image-20230816002539299

接著交換一下:

事務A當前讀查詢記錄ID:6 ,事務B當前讀查詢ID:5

image-20230816003007483

會發(fā)現兩個事務中的事務B立馬就報錯: ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

通常來說InnoDB存儲引擎選擇回滾undo量最小的事務。

到此這篇關于MySQL阻塞與死鎖的解決的文章就介紹到這了,更多相關MySQL阻塞與死鎖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mysql插入數據方式(insert into 、replace into解析)

    Mysql插入數據方式(insert into 、replace into解析)

    這篇文章主要介紹了Mysql插入數據方式(insert into 、replace into解析),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • mysql中blob數據處理方式

    mysql中blob數據處理方式

    本文通過實例代碼給大家介紹了mysql中blob數據處理方式,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-06-06
  • mysql排序失效問題的解決

    mysql排序失效問題的解決

    本文主要介紹了mysql排序失效問題的解決,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • MySQL可視化工具Navicat的連接方法

    MySQL可視化工具Navicat的連接方法

    今天小編就為大家分享一篇關于MySQL可視化工具Navicat的連接方法,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • MySQL數據庫基礎篇SQL窗口函數示例解析教程

    MySQL數據庫基礎篇SQL窗口函數示例解析教程

    這篇文章主要為大家介紹了MySQL數據庫基礎篇之窗口函數示例解析教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • MySql,MVCC實現及其機制,快照讀在RC,RR下的區(qū)別說明

    MySql,MVCC實現及其機制,快照讀在RC,RR下的區(qū)別說明

    這篇文章主要介紹了MySql,MVCC實現及其機制,快照讀在RC,RR下的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • MySQL死鎖解析與解決方法

    MySQL死鎖解析與解決方法

    在數據庫管理中,死鎖是一種常見而又棘手的問題,當多個事務相互等待對方釋放鎖資源時,死鎖就會發(fā)生,本文將介紹MySQL中死鎖產生的原因、如何查詢死鎖,以及解決死鎖的方法,需要的朋友可以參考下
    2024-01-01
  • 分析一個MySQL的異常查詢的案例

    分析一個MySQL的異常查詢的案例

    這篇文章主要介紹了分析一個MySQL的異常查詢的案例,主要是針對索引方面的操作問題,需要的朋友可以參考下
    2015-05-05
  • 逐步講解MySQL中定時事件計劃的創(chuàng)建

    逐步講解MySQL中定時事件計劃的創(chuàng)建

    這篇文章主要介紹了MySQL中定時事件計劃的創(chuàng)建,包括對于MySQL定時器的用戶事件權限作出了解釋說明,需要的朋友可以參考下
    2016-05-05

最新評論