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

MySQL?insert死鎖問題解決詳細(xì)記錄

 更新時(shí)間:2022年11月04日 12:01:58   作者:jhgdike  
上周遇到一個(gè)因insert而引發(fā)的死鎖問題,其成因比較令人費(fèi)解,下面這篇文章主要給大家介紹了關(guān)于MySQL?insert死鎖問題解決詳細(xì)記錄的相關(guān)資料,需要的朋友可以參考下

Insert死鎖問題剖析

線上有個(gè)批量的insert … on duplicate key update語句引發(fā)的死鎖問題,查過很多資料并且親自嘗試過后,發(fā)現(xiàn)好多博客說的都是錯(cuò)的,其實(shí)本身只跟insert的順序有關(guān),在此記錄一下備忘。

前置知識(shí)

X型鎖:排他鎖

S型鎖:共享鎖

行鎖:鎖住一行記錄

Next-Key鎖:左開右閉區(qū)間

Gap鎖:左右開區(qū)間

構(gòu)造死鎖

建表:

CREATE TABLE hero (
    number INT AUTO_INCREMENT,
    name VARCHAR(100),
    country varchar(100),
    PRIMARY KEY (number),
    UNIQUE KEY uk_name (name)
) Engine=InnoDB CHARSET=utf8;

構(gòu)造初始數(shù)據(jù):

INSERT INTO hero VALUES
    (1, 'l劉備', '蜀'),
    (3, 'z諸葛亮', '蜀'),
    (8, 'c曹操', '魏'),
    (15, 'x荀彧', '魏'),
    (20, 's孫權(quán)', '吳');

好了,開始了,下面開始兩個(gè)事務(wù),按順序執(zhí)行:

事務(wù)1

begin:
INSERT INTO hero(name, country) VALUES('g關(guān)羽', '蜀');

事務(wù)2

begin:
INSERT INTO hero(name, country) VALUES('g關(guān)羽', '蜀');

事務(wù)1

INSERT INTO hero(name, country) VALUES('d鄧艾', '魏');

來了,它來了,這個(gè)時(shí)候我們就可以注意到事務(wù)2的死鎖報(bào)錯(cuò)了:

# 事務(wù)T2
mysql> INSERT INTO hero(name, country) VALUES('g關(guān)羽', '蜀');
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

原因

請(qǐng)?zhí)砑訄D片描述

  • T1先插入name值為g關(guān)羽的記錄,可以插入成功,此時(shí)對(duì)應(yīng)的唯一索引記錄被隱式鎖保護(hù)
  • T2隨后插入name值為g關(guān)羽的記錄(必須為同一條記錄),發(fā)生阻塞,并且T2會(huì)想要獲取一把S型next-key鎖(只有唯一索引才會(huì)發(fā)生)(左開右閉)。此時(shí)T1的隱式鎖轉(zhuǎn)化為顯示鎖(X型行鎖)
  • T1想要插入d鄧艾的記錄,由于T2的next-key鎖(雖然沒被T2持有,但鎖已存在)而進(jìn)入阻塞等待狀態(tài),進(jìn)而發(fā)生死鎖

故死鎖產(chǎn)生的原因

  • T1在等待T2釋放name值為’g關(guān)羽’的二級(jí)索引記錄上的gap鎖。
  • T2在等待T1釋放name值為’g關(guān)羽’的二級(jí)索引記錄上的X型行鎖。

MySQL 5.7 的死鎖

前提

在比較新的版本中都可以遇見的,只要是insert … on duplicate key update 觸發(fā)了后面的update操作,那么此時(shí)其他的insert語句都會(huì)被阻塞,這主要是為了解決RR下的一些幻讀問題。

示例

在5.7版本中又有一些特殊情況。還是舉例

假如有如下表和數(shù)據(jù)

demo表

idnamevalue
11112
12222
13332

此時(shí),如果事務(wù)1執(zhí)行了:

insert into demo (name, value) VALUES ("333", 1) ON duplicate KEY UPDATE value = value + 1;

事務(wù)2執(zhí)行了:

insert into demo (name, value) VALUES ("223", 1) ON duplicate KEY UPDATE value = value + 1;

事務(wù)3執(zhí)行了:

insert into demo (name, value) VALUES ("224", 1) ON duplicate KEY UPDATE value = value + 1;

那么首先事務(wù)2和事務(wù)3會(huì)被阻塞,然后事務(wù)1提交了,事務(wù)2和事務(wù)3就會(huì)發(fā)生死鎖,其中一個(gè)爆出死鎖的錯(cuò)誤然后失敗,另一個(gè)則成功執(zhí)行。

原因

當(dāng)insert … on duplicate key 執(zhí)行成功之時(shí),會(huì)在當(dāng)前唯一鍵和之前唯一鍵之間加一個(gè)隱式GAP鎖,如上會(huì)在222和333之間加上GAP鎖,此時(shí),事務(wù)2和事務(wù)3想插入新數(shù)據(jù)都會(huì)被GAP鎖阻塞,此時(shí)GAP鎖轉(zhuǎn)為顯式,事務(wù)2和事務(wù)3同時(shí)也分別想要獲取X型的插入意向鎖。

然后事務(wù)1提交,此時(shí)GAP鎖并不會(huì)被釋放,由于5.7的bug,事務(wù)2和事務(wù)3都會(huì)拿到GAP鎖,此時(shí)他們?nèi)カ@取插入意向鎖的時(shí)候由于GAP鎖被對(duì)方拿到而矛盾,進(jìn)而死鎖。

解決方案

網(wǎng)上有很多方法,這里我提出一個(gè)另類的想法。

我們可以先用非事務(wù)的insert ignore去初始化數(shù)據(jù),后面在用事務(wù)的update操作去更新。

參考:https://zhuanlan.zhihu.com/p/457191971

總結(jié)

到此這篇關(guān)于MySQL insert死鎖問題的文章就介紹到這了,更多相關(guān)MySQL insert死鎖問題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解MySql基本查詢、連接查詢、子查詢、正則表達(dá)查詢

    詳解MySql基本查詢、連接查詢、子查詢、正則表達(dá)查詢

    本篇文章采用了圖文相結(jié)合的方式介紹了數(shù)據(jù)庫的四大查詢方式:基本查詢、連接查詢、子查詢、正則表達(dá)查詢,需要了解的朋友可以參考下
    2015-07-07
  • Mysql允許外網(wǎng)訪問設(shè)置步驟

    Mysql允許外網(wǎng)訪問設(shè)置步驟

    本文給大家分享Mysql允許外網(wǎng)訪問設(shè)置步驟,通過簡(jiǎn)單的五步操作就可以實(shí)現(xiàn)mysql允許外圍訪問功能,非常不錯(cuò),需要的朋友參考下吧
    2016-10-10
  • MySQL如何導(dǎo)入csv格式數(shù)據(jù)文件解決方案

    MySQL如何導(dǎo)入csv格式數(shù)據(jù)文件解決方案

    本文將詳細(xì)介紹MySQL如何導(dǎo)入csv格式數(shù)據(jù)文件并提供詳細(xì)解決方案,需要了解的朋友可以參考下
    2012-11-11
  • MySQL?8.0.29?解壓版安裝配置方法圖文教程

    MySQL?8.0.29?解壓版安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了MySQL?8.0.29?解壓版安裝配置方法圖文教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • mysql獲取字符串長(zhǎng)度函數(shù)(CHAR_LENGTH)

    mysql獲取字符串長(zhǎng)度函數(shù)(CHAR_LENGTH)

    本文介紹一下關(guān)于mysql獲取字符串長(zhǎng)度的方法,希望此教程對(duì)各位同學(xué)會(huì)有所幫助哦。
    2013-11-11
  • mysql的MVCC多版本并發(fā)控制的實(shí)現(xiàn)

    mysql的MVCC多版本并發(fā)控制的實(shí)現(xiàn)

    這篇文章主要介紹了mysql的MVCC多版本并發(fā)控制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • springboot啟動(dòng)404問題以及解決方案

    springboot啟動(dòng)404問題以及解決方案

    這篇文章主要介紹了springboot啟動(dòng)404問題以及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 淺談慢SQL優(yōu)化之索引的作用

    淺談慢SQL優(yōu)化之索引的作用

    本文針對(duì)?MySQL?數(shù)據(jù)庫的?InnoDB?存儲(chǔ)引擎,介紹其中索引的實(shí)現(xiàn)以及索引在慢?SQL?優(yōu)化中的作用,本文主要討論不同場(chǎng)景下索引生效與失效的原因,感興趣的小伙伴可以跟著小編一起來探討
    2023-05-05
  • 數(shù)據(jù)庫索引知識(shí)點(diǎn)整理

    數(shù)據(jù)庫索引知識(shí)點(diǎn)整理

    這篇文章主要介紹了數(shù)據(jù)庫索引知識(shí)點(diǎn)整理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考
    2021-01-01
  • 關(guān)于MYSQL的優(yōu)化全面詳解

    關(guān)于MYSQL的優(yōu)化全面詳解

    一直用了那么久的mysql,雖然了解了一些優(yōu)化方法,但是都是比較簡(jiǎn)單的一些應(yīng)用,這次就系統(tǒng)的了解一下
    2012-09-09

最新評(píng)論

油尖旺区| 建阳市| 达尔| 绥芬河市| 梅河口市| 吉林市| 聂拉木县| 新建县| 巴彦县| 铜梁县| 太谷县| 卢湾区| 孝昌县| 富民县| 清水河县| 青海省| 安义县| 北京市| 乐昌市| 青冈县| 元江| 连州市| 南郑县| 历史| 山西省| 法库县| 抚顺市| 丰顺县| 德惠市| 茶陵县| 黎川县| 丹巴县| 宜昌市| 嘉荫县| 木里| 通山县| 保亭| 山阴县| 蒙阴县| 彝良县| 霍邱县|