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

通過(guò)唯一索引S鎖與X鎖來(lái)了解MySQL死鎖套路

 更新時(shí)間:2019年05月22日 14:57:25   作者:挖坑的張師傅  
毫不夸張的說(shuō),有一半以上的死鎖問(wèn)題由唯一索引貢獻(xiàn),后面介紹的很多死鎖的問(wèn)題都跟唯一索引有關(guān)。這次我們講一段唯一索引 S 鎖與 X 鎖的案例,下面小編來(lái)和大家一起學(xué)習(xí)一下

初學(xué)者從源碼理解MySQL死鎖問(wèn)題中介紹了使用調(diào)試 MySQL  源碼的方式來(lái)查看死鎖的過(guò)程,這篇文章來(lái)講講一個(gè)常見(jiàn)的案例。
這次我們講一段唯一索引 S 鎖與 X 鎖的愛(ài)恨情仇

我們來(lái)看一個(gè)簡(jiǎn)化過(guò)的例子

# 構(gòu)造數(shù)據(jù)
CREATE TABLE `t1` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10),
 `level` int(11),
 PRIMARY KEY (`id`),
 UNIQUE KEY `uk_name` (`name`)
);
INSERT INTO `t1` (`name`, `level`) VALUES ('A',0);

# 出現(xiàn)問(wèn)題的sql語(yǔ)句如下,并發(fā)情況下就會(huì)出現(xiàn)死鎖
INSERT ignore INTO `t1` (`name`, `level`) VALUES ('A',0);
update t1 set level = 1 where name = "A";

我們用之前介紹過(guò)的源碼分析方式,先來(lái)看下這兩條語(yǔ)句分別加什么鎖,然后分析死鎖形成的過(guò)程。

第一條語(yǔ)句

INSERT ignore INTO t1 (name, level) VALUES ('A',0);

在調(diào)試中得到的結(jié)果如下

可以看到這條語(yǔ)句對(duì)唯一鍵 uk_name 加共享鎖(S鎖),而且成功。

第二條語(yǔ)句

update t1 set level = 1 where name = "A"; 

 通過(guò)唯一鍵更新數(shù)據(jù)庫(kù)字段。

這種情況在之前的文章已經(jīng)介紹過(guò),會(huì)對(duì)唯一索引加 X 鎖,然后對(duì)主鍵索引加 X 鎖

這樣就可以非常輕松的復(fù)現(xiàn)死鎖的問(wèn)題了,步驟如下

1.開(kāi)啟兩個(gè) session,分別 begin
2.session1 執(zhí)行INSERT ignore INTO t1 (name, level) VALUES ('A',0);
3.session2 執(zhí)行INSERT ignore INTO t1 (name, level) VALUES ('A',0);
4.session1 執(zhí)行update t1 set level = 1 where name = "A"; 進(jìn)入等待狀態(tài)
5.session2 執(zhí)行update t1 set level = 1 where name = "A";,死鎖產(chǎn)生,被回滾,同時(shí)事務(wù) 1 執(zhí)行成功

詳細(xì)的鎖狀態(tài)變化如下

t1 t2 備注
INSERT IGNORE INTO - t1成功獲得uk的S鎖 DB_SUCCESS
- INSERT IGNORE INTO t2成功獲得uk的S鎖 DB_SUCCESS
UPDATE - t1嘗試獲得uk的X鎖,但沒(méi)有成功,處于等待狀態(tài) DB_LOCK_WAIT
- UPDATE t2嘗試獲得uk的X鎖,發(fā)現(xiàn)死鎖產(chǎn)生 DB_DEADLOCK
- Deadlock t2釋放S鎖
成功 - -

死鎖日志如下:

LATEST DETECTED DEADLOCK
------------------------
181208 23:00:52
*** (1) TRANSACTION:
TRANSACTION 53A7, ACTIVE 162 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 376, 2 row lock(s)
MySQL thread id 12, OS thread handle 0x700010522000, query id 1424 localhost root Updating
update t1 set level = 1 where name = "A"
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 89 page no 4 n bits 72 index `uk_name` of table `lock_demo2`.`t1` trx id 53A7 lock_mode X locks rec but not gap waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 1; hex 41; asc A;;
 1: len 4; hex 80000001; asc ;;

*** (2) TRANSACTION:
TRANSACTION 53A8, ACTIVE 8 sec starting index read
mysql tables in use 1, locked 1
3 lock struct(s), heap size 376, 2 row lock(s)
MySQL thread id 96, OS thread handle 0x70001062e000, query id 1425 localhost root Updating
update t1 set level = 1 where name = "A"
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 89 page no 4 n bits 72 index `uk_name` of table `lock_demo2`.`t1` trx id 53A8 lock mode S
Record lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 1; hex 41; asc A;;
 1: len 4; hex 80000001; asc ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 89 page no 4 n bits 72 index `uk_name` of table `lock_demo2`.`t1` trx id 53A8 lock_mode X locks rec but not gap waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 1; hex 41; asc A;;
 1: len 4; hex 80000001; asc ;;

*** WE ROLL BACK TRANSACTION (2)

來(lái)詳細(xì)看一下這個(gè)死鎖日志

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 89 page no 4 n bits 72 index uk_name of table lock_demo2.t1 trx id 53A7 lock_mode X locks rec but not gap waiting

事務(wù) 1 想獲取 uk_name 唯一索引上的 X 鎖 (非 gap 鎖的記錄鎖)

*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 89 page no 4 n bits 72 index uk_name of table lock_demo2.t1 trx id 53A8 lock mode S

事務(wù) 2 持有uk_name 唯一索引上的 S 鎖(共享鎖)

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 89 page no 4 n bits 72 index uk_name of table lock_demo2.t1 trx id 53A8 lock_mode X locks rec but not gap waiting

事務(wù) 2 想獲得 uk_name 唯一索引上的 X 鎖(非 gap 鎖的記錄鎖)
跟之前理論上推斷的結(jié)論是一致的

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQL用戶賬戶管理和權(quán)限管理深入講解

    MySQL用戶賬戶管理和權(quán)限管理深入講解

    這篇文章主要給大家介紹了關(guān)于MySQL用戶賬戶管理和權(quán)限管理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • MySQL存儲(chǔ)過(guò)程的深入講解(in、out、inout)

    MySQL存儲(chǔ)過(guò)程的深入講解(in、out、inout)

    這篇文章主要給大家介紹了關(guān)于MySQL存儲(chǔ)過(guò)程(in、out、inout)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • centos7下mysqldump定時(shí)備份數(shù)據(jù)庫(kù)的方法實(shí)現(xiàn)

    centos7下mysqldump定時(shí)備份數(shù)據(jù)庫(kù)的方法實(shí)現(xiàn)

    MySQL Dump是MySQL提供的方便導(dǎo)出數(shù)據(jù)庫(kù)數(shù)據(jù)的工具,本文主要介紹了centos7下mysqldump定時(shí)備份數(shù)據(jù)庫(kù)的方法實(shí)現(xiàn),感興趣的可以了解一下
    2023-08-08
  • Ubuntu下MySQL中文亂碼的問(wèn)題解決

    Ubuntu下MySQL中文亂碼的問(wèn)題解決

    對(duì)于MySQL中文亂碼問(wèn)題(我的是Ubuntu系統(tǒng)),在網(wǎng)上看了很多解決方案,期間也走了不少?gòu)澛?,所以想著根?jù)自己的解決之路寫一篇文章分享給有需要的朋友們,所以這篇文章主要介紹了如何解決Ubuntu下MySQL中文亂碼問(wèn)題的相關(guān)資料,需要的朋友可以參考借鑒。
    2017-02-02
  • Windows下mysql?8.0.28?安裝配置方法圖文教程

    Windows下mysql?8.0.28?安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了Windows下mysql?8.0.28?安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • MySQL DeadLock故障排查全過(guò)程記錄

    MySQL DeadLock故障排查全過(guò)程記錄

    這篇文章主要給大家介紹了關(guān)于MySQL DeadLock故障排查的全過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • 詳解MySQL中Order By排序和filesort排序的原理及實(shí)現(xiàn)

    詳解MySQL中Order By排序和filesort排序的原理及實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了MySQL的Order By排序的底層原理與filesort排序,以及排序優(yōu)化手段,文中的示例代碼講解詳細(xì),感興趣的小編可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • MySQL不能顯示中文問(wèn)題及解決

    MySQL不能顯示中文問(wèn)題及解決

    這篇文章主要介紹了MySQL不能顯示中文問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • centos6.5中rpm包安裝mysql5.7初始化出錯(cuò)的解決方法

    centos6.5中rpm包安裝mysql5.7初始化出錯(cuò)的解決方法

    這篇文章主要介紹了centos6.5中rpm包安裝mysql5.7初始化出錯(cuò)的解決方法,需要的朋友可以參考下
    2017-09-09
  • Mysql和文件系統(tǒng)的關(guān)聯(lián)詳情

    Mysql和文件系統(tǒng)的關(guān)聯(lián)詳情

    這篇文章主要介紹了Mysql和文件系統(tǒng)的關(guān)聯(lián)詳情,Mysql常用的存儲(chǔ)引擎如InnoDB、MyISAM采用的是文件存儲(chǔ),自然和文件系統(tǒng)掛鉤,那么Mysql都有哪些地方用到了文件系統(tǒng)呢,下面我們一起進(jìn)入文章學(xué)習(xí)詳細(xì)內(nèi)容吧
    2022-09-09

最新評(píng)論

民勤县| 兴国县| 德兴市| 永吉县| 祁门县| 渝中区| 白水县| 沙湾县| 陆良县| 永州市| 潞城市| 平塘县| 招远市| 怀安县| 莱西市| 江阴市| 红原县| 固始县| 桂平市| 黎城县| 宁都县| 衡阳县| 河东区| 定安县| 略阳县| 凤台县| 卓尼县| 南皮县| 博客| 沅江市| 泾川县| 曲阳县| 铁力市| 巩义市| 蓬安县| 垦利县| 封开县| 康定县| 营口市| 冷水江市| 郴州市|