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

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

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

前提

1、在RR隔離級別下。

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

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

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

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

數(shù)據(jù)準(zhǔn)備

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

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

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

實(shí)驗(yàn)一、間隙鎖互斥

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

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

這四個(gè)區(qū)間。

事務(wù)A刪除某個(gè)區(qū)間內(nèi)的一條不存在記錄,獲取到共享間隙鎖,會阻止其他事務(wù)B在相應(yīng)的區(qū)間插入數(shù)據(jù),因?yàn)椴迦胄枰@取排他間隙鎖。

-- 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);

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

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

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

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

如果事務(wù)A一直不提交,事務(wù)B會一直等待,直到超時(shí),超時(shí)后會顯示:

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

實(shí)驗(yàn)二、共享排他鎖死鎖

回到數(shù)據(jù)的初始狀態(tài),這次需要三個(gè)并發(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);

三個(gè)事務(wù)都試圖往表中插入一條為7的記錄:

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

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

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

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

rollback;
id=7排他鎖釋放。

則B,C會繼續(xù)進(jìn)行主鍵校驗(yàn):

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

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

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

當(dāng)然,InnoDB有死鎖檢測機(jī)制,B和C中的一個(gè)事務(wù)會插入成功,另一個(gè)事務(wù)會自動放棄:

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

實(shí)驗(yàn)三、并發(fā)間隙鎖的死鎖

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

回到數(shù)據(jù)的初始狀態(tài),這次需要兩個(gè)并發(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;

來查看死鎖的情況。

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

總結(jié)

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

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

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

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

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

相關(guān)文章

  • MYSQL?常用語句速查(最新整理)

    MYSQL?常用語句速查(最新整理)

    這篇文章主要介紹了MYSQL?常用語句速查,包括庫級操作、表級操作、字段級操作和數(shù)據(jù)級操作,需要的朋友可以參考下
    2024-12-12
  • mysql 8.0.22 zip壓縮包版(免安裝)下載、安裝配置步驟詳解

    mysql 8.0.22 zip壓縮包版(免安裝)下載、安裝配置步驟詳解

    這篇文章主要介紹了mysql 8.0.22 zip壓縮包版(免安裝)下載、安裝配置步驟詳解,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • MySQL主從配置學(xué)習(xí)筆記

    MySQL主從配置學(xué)習(xí)筆記

    在本篇文章里小編給大家整理的是關(guān)于MySQL主從配置學(xué)習(xí)筆記相關(guān)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • 一文了解Mysql分區(qū)的使用

    一文了解Mysql分區(qū)的使用

    分區(qū)允許根據(jù)可以設(shè)置為任意大小的規(guī)則,跨文件系統(tǒng)分配單個(gè)表的多個(gè)部分,本文主要介紹了Mysql分區(qū)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • mysql免安裝制作使用說明

    mysql免安裝制作使用說明

    mysql免安裝版本的制作方法,需要的朋友可以參考下。
    2010-08-08
  • MySQL+Canal同步ES延時(shí)問題分析及解決過程

    MySQL+Canal同步ES延時(shí)問題分析及解決過程

    文章探討了MySQL-Canal-ES架構(gòu)在異構(gòu)數(shù)據(jù)場景中的應(yīng)用,分析了數(shù)據(jù)同步延時(shí)問題的根源(如MySQL binlog生成滯后、Canal單線程處理、ES索引寫入瓶頸),并提出全鏈路優(yōu)化方案,包括日志配置調(diào)整、并行解析、批量寫入及監(jiān)控機(jī)制,最終實(shí)現(xiàn)高效、低延遲的數(shù)據(jù)處理與查詢
    2025-09-09
  • CentOS 8 安裝 MySql并設(shè)置允許遠(yuǎn)程連接的方法

    CentOS 8 安裝 MySql并設(shè)置允許遠(yuǎn)程連接的方法

    這篇文章主要介紹了CentOS 8 安裝 MySql并設(shè)置允許遠(yuǎn)程連接的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • MySQL新建用戶中的%到底包不包括localhost?

    MySQL新建用戶中的%到底包不包括localhost?

    操作MySQL的時(shí)候發(fā)現(xiàn),有時(shí)只建了%的賬號,可以通過localhost連接,有時(shí)候卻不可以,網(wǎng)上搜索也找不到滿意的答案,干脆手動測試一波
    2019-02-02
  • MySQL日期格式以及日期函數(shù)舉例詳解

    MySQL日期格式以及日期函數(shù)舉例詳解

    這篇文章主要給大家介紹了關(guān)于MySQL日期格式及日期函數(shù)的相關(guān)資料,日期在數(shù)據(jù)庫中是一個(gè)常見且重要的數(shù)據(jù)類型,在MySQL中我們可以使用各種函數(shù)和格式化選項(xiàng)來處理和顯示日期,需要的朋友可以參考下
    2023-11-11
  • mysql外鍵(Foreign Key)介紹和創(chuàng)建外鍵的方法

    mysql外鍵(Foreign Key)介紹和創(chuàng)建外鍵的方法

    這篇文章主要介紹了mysql外鍵(Foreign Key)命令和添加外鍵方法,需要的朋友可以參考下
    2014-02-02

最新評論

射阳县| 娄底市| 桦甸市| 稻城县| 台安县| 盱眙县| 潼南县| 防城港市| 江都市| 武宁县| 苍梧县| 青河县| 温州市| 水城县| 望江县| 河池市| 揭东县| 恩施市| 新竹市| 彩票| 武鸣县| 四子王旗| 咸宁市| 奎屯市| 横峰县| 台中市| 临猗县| 延吉市| 万宁市| 沽源县| 桐乡市| 阜城县| 富锦市| 宁海县| 尚志市| 文水县| 罗定市| 民县| 越西县| 德保县| 远安县|