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

MySQL如何處理InnoDB并發(fā)事務中的間隙鎖死鎖

 更新時間:2023年10月15日 11:24:51   作者:jacheut  
這篇文章主要為大家介紹了MySQL如何處理InnoDB并發(fā)事務中的間隙鎖死鎖,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前提

1、在RR隔離級別下。

2、查看間隙鎖是否關(guān)閉

區(qū)間鎖(間隙鎖,臨鍵鎖)是InnoDB特有施加在索引記錄區(qū)間的鎖,MySQL5.6可以手動關(guān)閉區(qū)間鎖,它由innodb_locks_unsafe_for_binlog參數(shù)控制:

  • 設置為ON,表示關(guān)閉區(qū)間鎖,此時一致性會被破壞(所以是unsafe)
  • 設置為OFF,表示開啟區(qū)間鎖
show global variables like "innodb_locks%";

3、show global variables like "autocommit"; 查看事務是否自動提交。

數(shù)據(jù)準備

InnoDB的行鎖都是實現(xiàn)在索引上的,實驗可以使用主鍵,建表時設定為innodb引擎:

create table t (
id int(10) primary key
)engine=innodb;
-- 插入一些實驗數(shù)據(jù):
start transaction;
insert into t values(1);
insert into t values(3);
insert into t values(10);
commit;

這是實驗的初始狀態(tài),不同實驗開始之初,都默認回到初始狀態(tài)。

實驗一、間隙鎖互斥

開啟區(qū)間鎖,RR的隔離級別下,上例會有:

(-infinity, 1)
(1, 3)
(3, 10)
(10, infinity)

這四個區(qū)間。

事務A刪除某個區(qū)間內(nèi)的一條不存在記錄,獲取到共享間隙鎖,會阻止其他事務B在相應的區(qū)間插入數(shù)據(jù),因為插入需要獲取排他間隙鎖。

-- session A:
set session autocommit=0;
start transaction;
delete from t where id=5;

-- session B:
set session autocommit=0;
start transaction;
insert into t values(0);
insert into t values(2);
insert into t values(12);
insert into t values(7);

事務B插入的值:0, 2, 12都不在(3, 10)區(qū)間內(nèi),能夠成功插入,而7在(3, 10)這個區(qū)間內(nèi),會阻塞。

可以使用:show engine innodb status; 來查看鎖的情況

insert into t values(7); 正在等待共享間隙鎖的釋放。

如果事務A提交或者回滾,事務B就能夠獲得相應的鎖,以繼續(xù)執(zhí)行。

如果事務A一直不提交,事務B會一直等待,直到超時,超時后會顯示:

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

實驗二、共享排他鎖死鎖

回到數(shù)據(jù)的初始狀態(tài),這次需要三個并發(fā)的session。

-- session A先執(zhí)行:
set session autocommit=0;
start transaction;
insert into t values(7);
 
-- session B后執(zhí)行:
set session autocommit=0;
start transaction;
insert into t values(7);
 
-- session C最后執(zhí)行:
set session autocommit=0;
start transaction;
insert into t values(7);

三個事務都試圖往表中插入一條為7的記錄:

(1)A先執(zhí)行,插入成功,并獲取id=7的排他鎖;

(2)B后執(zhí)行,需要進行PK校驗,故需要先獲取id=7的共享鎖,阻塞;

(3)C后執(zhí)行,也需要進行PK校驗,也要先獲取id=7的共享鎖,也阻塞;

如果此時,session A執(zhí)行:

rollback;
id=7排他鎖釋放。

則B,C會繼續(xù)進行主鍵校驗:

(1)B會獲取到id=7共享鎖,主鍵未互斥;

(2)C也會獲取到id=7共享鎖,主鍵未互斥;

B和C要想插入成功,必須獲得id=7的排他鎖,但由于雙方都已經(jīng)獲取到id=7的共享鎖,它們都無法獲取到彼此的排他鎖,死鎖就出現(xiàn)了。

當然,InnoDB有死鎖檢測機制,B和C中的一個事務會插入成功,另一個事務會自動放棄:

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

實驗三、并發(fā)間隙鎖的死鎖

共享排他鎖,在并發(fā)量插入相同記錄的情況下會出現(xiàn),相應的案例比較容易分析。而并發(fā)的間隙鎖死鎖,是比較難定位的。

回到數(shù)據(jù)的初始狀態(tài),這次需要兩個并發(fā)的session,其SQL執(zhí)行序列如下:

A:set session autocommit=0;
A:start transaction;
A:delete from t where id=6;
         B:set session autocommit=0;
         B:start transaction;
         B:delete from t where id=7;
A:insert into t values(5);
         B:insert into t values(8);

A執(zhí)行delete后,會獲得(3, 10)的共享間隙鎖。
B執(zhí)行delete后,也會獲得(3, 10)的共享間隙鎖。
A執(zhí)行insert后,希望獲得(3, 10)的排他間隙鎖,于是會阻塞。
B執(zhí)行insert后,也希望獲得(3, 10)的排他間隙鎖,于是死鎖出現(xiàn)。

仍然使用:

show engine innodb status;

來查看死鎖的情況。

另外,檢測到死鎖后,事務2自動回滾了:WE ROLL BACK TRANSACTION (2)
事務1將會執(zhí)行成功。

總結(jié)

并發(fā)事務,間隙鎖可能互斥

(1)A刪除不存在的記錄,獲取共享間隙鎖;

(2)B插入,必須獲得排他間隙鎖,故互斥;

  • 并發(fā)插入相同記錄,可能死鎖(某一個回滾)
  • 并發(fā)插入,可能出現(xiàn)間隙鎖死鎖(難排查)
  • show engine innodb status; 可以查看InnoDB的鎖情況,也可以調(diào)試死鎖

以上就是MySQL如何處理InnoDB并發(fā)事務中的間隙鎖死鎖的詳細內(nèi)容,更多關(guān)于MySQL InnoDB死鎖的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:

相關(guān)文章

  • MySQL Limit性能優(yōu)化及分頁數(shù)據(jù)性能優(yōu)化詳解

    MySQL Limit性能優(yōu)化及分頁數(shù)據(jù)性能優(yōu)化詳解

    今天小編就為大家分享一篇關(guān)于MySQL Limit性能優(yōu)化及分頁數(shù)據(jù)性能優(yōu)化詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • MySQL數(shù)據(jù)庫中的安全設置方案

    MySQL數(shù)據(jù)庫中的安全設置方案

    MySQL 是一個真正的多用戶、多線程SQL數(shù)據(jù)庫服務器,它是一個客戶機/服務器結(jié)構(gòu)的實現(xiàn)。MySQL是現(xiàn)在流行的關(guān)系數(shù)據(jù)庫中其中的一種,相比其它的數(shù)據(jù)庫管理系統(tǒng)(DBMS)來說,MySQL具有小巧、功能齊全、查詢迅捷等優(yōu)點。MySQL 主要目標是快速、健壯和易用。
    2015-04-04
  • 連接mysql錯誤問題解決方案

    連接mysql錯誤問題解決方案

    文章主要介紹了在Windows環(huán)境下,如何配置MySQL以允許外部機器連接,通過修改MySQL的配置文件,將root用戶的訪問權(quán)限從默認的localhost改為%,并執(zhí)行flush操作,解決了連接錯誤的問題,感興趣的朋友一起看看吧
    2025-02-02
  • mysql 8.0.21免安裝版配置方法圖文教程

    mysql 8.0.21免安裝版配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql 8.0.21免安裝版配置教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • mysql下完整導出導入實現(xiàn)方法

    mysql下完整導出導入實現(xiàn)方法

    對于大量數(shù)據(jù)的導入導出,是件挺麻煩的事,需要考慮很多的細節(jié),這類對于需要大量數(shù)據(jù)導入導出的朋友可以參考下。
    2010-12-12
  • 淺析MysQL B-Tree 索引

    淺析MysQL B-Tree 索引

    這篇文章主要介紹了MysQL B-Tree 索引的相關(guān)資料,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-11-11
  • MySQL中定時器的底層實現(xiàn)原理及使用方法

    MySQL中定時器的底層實現(xiàn)原理及使用方法

    定時器可以用于定期執(zhí)行特定的SQL語句、備份數(shù)據(jù)、生成報表等操作,本文將詳細介紹MySQL中定時器的底層實現(xiàn)機制以及如何使用它
    2023-07-07
  • MySQL如何支撐起億級流量

    MySQL如何支撐起億級流量

    當每天新增數(shù)據(jù)上億級的時候,單表數(shù)據(jù)量在百萬級別,數(shù)據(jù)庫服務器的高峰期寫入壓力、查詢壓力在都很高的時候,該如何讓MySQL順利支撐起來呢?本片文章將教給你詳細的方案
    2021-09-09
  • mysql查詢每小時數(shù)據(jù)和上小時數(shù)據(jù)的差值實現(xiàn)思路詳解

    mysql查詢每小時數(shù)據(jù)和上小時數(shù)據(jù)的差值實現(xiàn)思路詳解

    這篇文章主要介紹了mysql查詢每小時數(shù)據(jù)和上小時數(shù)據(jù)的差值,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • 深入了解MySQL中索引優(yōu)化器的工作原理

    深入了解MySQL中索引優(yōu)化器的工作原理

    本文將解讀MySQL數(shù)據(jù)庫查詢優(yōu)化器(CBO)的工作原理。文中簡單介紹了MySQL?Server的組成,MySQL優(yōu)化器選擇索引額原理以及SQL成本分析,需要的可以參考一下
    2022-11-11

最新評論