欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過(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.開啟兩個(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)文章

  • php mysql連接數(shù)據(jù)庫(kù)實(shí)例

    php mysql連接數(shù)據(jù)庫(kù)實(shí)例

    這篇文章主要介紹了php mysql連接數(shù)據(jù)庫(kù)實(shí)例,需要的朋友可以參考下
    2016-09-09
  • mysql中 ${param}與#{param}使用區(qū)別

    mysql中 ${param}與#{param}使用區(qū)別

    這篇文章主要介紹了mysql中 ${param}與#{param}使用區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • mysql數(shù)據(jù)庫(kù)遷移至Oracle數(shù)據(jù)庫(kù)

    mysql數(shù)據(jù)庫(kù)遷移至Oracle數(shù)據(jù)庫(kù)

    這篇文章主要為大家詳細(xì)介紹了mysql數(shù)據(jù)庫(kù)遷移至Oracle數(shù)據(jù)庫(kù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • MySql存儲(chǔ)表情報(bào)錯(cuò)的排查解決

    MySql存儲(chǔ)表情報(bào)錯(cuò)的排查解決

    隨著互聯(lián)網(wǎng)的發(fā)展,產(chǎn)生了許多新類型的字符,例如emoji這種類型的符號(hào),也就是我們通常在聊天時(shí)發(fā)的小黃臉表情,下面這篇文章主要給大家介紹了關(guān)于MySql存儲(chǔ)表情報(bào)錯(cuò)的排查解決,需要的朋友可以參考下
    2022-07-07
  • mysql中的mvcc?原理詳解

    mysql中的mvcc?原理詳解

    MVCC多版本并發(fā)控制,是用來(lái)在數(shù)據(jù)庫(kù)中控制并發(fā)的方法,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的并發(fā)訪問(wèn)用的,這篇文章主要介紹了mysql?mvcc?原理詳解,需要的朋友可以參考下
    2022-10-10
  • mysql刪除操作其實(shí)是假刪除問(wèn)題

    mysql刪除操作其實(shí)是假刪除問(wèn)題

    這篇文章主要介紹了mysql刪除操作其實(shí)是假刪除問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • MySQL性能監(jiān)控軟件Nagios的安裝及配置教程

    MySQL性能監(jiān)控軟件Nagios的安裝及配置教程

    這篇文章主要介紹了MySQL性能監(jiān)控軟件Nagios的安裝及配置教程,這里以CentOS操作系統(tǒng)為環(huán)境進(jìn)行演示,需要的朋友可以參考下
    2015-12-12
  • MySQL創(chuàng)建和刪除表操作命令實(shí)例講解

    MySQL創(chuàng)建和刪除表操作命令實(shí)例講解

    這篇文章主要介紹了MySQL創(chuàng)建和刪除表操作命令實(shí)例講解,本文講解了創(chuàng)建表、創(chuàng)建臨時(shí)表、查看已經(jīng)創(chuàng)建的mysql表等內(nèi)容,需要的朋友可以參考下
    2014-12-12
  • 解決mysql問(wèn)題:由于找不到MSVCR120.dll,無(wú)法繼續(xù)執(zhí)行代碼

    解決mysql問(wèn)題:由于找不到MSVCR120.dll,無(wú)法繼續(xù)執(zhí)行代碼

    這篇文章給大家分享解決mysql問(wèn)題:由于找不到MSVCR120.dll,無(wú)法繼續(xù)執(zhí)行代碼.通過(guò)重新安裝程序解決此問(wèn)題,下面小編把問(wèn)題記錄及解決過(guò)程分享給大家,需要的朋友參考下吧
    2021-06-06
  • mysql的定時(shí)任務(wù)實(shí)例教程

    mysql的定時(shí)任務(wù)實(shí)例教程

    定時(shí)任務(wù)是我們?cè)谌粘i_發(fā)維護(hù)中經(jīng)常會(huì)遇到的,下面這篇文章主要給大家介紹了關(guān)于mysql定時(shí)任務(wù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09

最新評(píng)論