久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL單表模擬鎖的有哪些場(chǎng)景

共計(jì) 2543 個(gè)字符,預(yù)計(jì)需要花費(fèi) 7 分鐘才能閱讀完成。

這篇文章主要介紹 MySQL 單表模擬鎖的有哪些場(chǎng)景,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

  在 MySQL 中對(duì)于并發(fā),鎖問(wèn)題總是會(huì)有很多值得討論的地方,但是通常來(lái)說(shuō),要模擬這些鎖或者一些鎖的問(wèn)題需要花點(diǎn)功夫,比如創(chuàng)建多個(gè)表,創(chuàng)建大量的數(shù)據(jù),然后像調(diào)試鐘表的秒針一樣,讓問(wèn)題剛好復(fù)現(xiàn)在哪個(gè)時(shí)間點(diǎn)上。如果換一個(gè)角度,單表來(lái)模擬這類(lèi)而是可以嗎,其實(shí)是可行的。

    今天簡(jiǎn)單通過(guò)單表的測(cè)試模擬死鎖,事務(wù)中的隱式提交(其實(shí)可以理解是個(gè) bug), 間隙鎖。

初始化數(shù)據(jù)

首先的準(zhǔn)備工作就是初始化數(shù)據(jù),我們創(chuàng)建一個(gè)表 test, 事務(wù)隔離級(jí)別為默認(rèn)的 RR。

建表語(yǔ)句:

create table test(

id int not null ,

name int ,

primary key(id),

unique key(name)

) engine=innodb;

事務(wù)隔離級(jí)別:

mysql show variables like %isolation%

+—————+—————–+

| Variable_name | Value           |

+—————+—————–+

| tx_isolation  | REPEATABLE-READ |

+—————+—————–+

1 row in set (0.00 sec)

除此之外就是打開(kāi)兩個(gè)窗口,我們簡(jiǎn)稱(chēng)為會(huì)話(huà) 1,會(huì)話(huà) 2.

模擬死鎖

我們開(kāi)始先模擬一下死鎖問(wèn)題。

會(huì)話(huà) 1:

我們開(kāi)啟一個(gè)事務(wù),插入一行記錄,數(shù)據(jù)就選做今天的日期吧。

mysql begin;

mysql insert into test values(2017,827);

Query OK, 1 row affected (0.01 sec)

會(huì)話(huà) 2;

mysql insert into test values(2016,827);

這個(gè)時(shí)候會(huì)話(huà) 2 會(huì)阻塞,這個(gè)時(shí)候有一種特殊的情況,那就是阻塞超時(shí),如果超時(shí),會(huì)自動(dòng)停止。

會(huì)話(huà) 1:

mysql insert into test values(2018,826);

Query OK, 1 row affected (0.00 sec)

可見(jiàn)會(huì)話(huà) 1 中的 DML 操作依舊是可以的。

會(huì)話(huà) 2:

mysql insert into test values(2016,827);

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

如果看會(huì)話(huà) 2 的情況,就會(huì)發(fā)現(xiàn)產(chǎn)生了死鎖。

如果要嘗試事務(wù)隔離級(jí)別 RC, 其實(shí)表現(xiàn)的效果是一樣的。

仔細(xì)看看這個(gè)操作的過(guò)程就會(huì)發(fā)現(xiàn),還是蠻“奇怪”的,數(shù)據(jù)之間彼此沒(méi)有直接的依賴(lài)關(guān)聯(lián),怎么會(huì)產(chǎn)生死鎖,這個(gè)里面有銀式鎖升級(jí),還有間隙鎖的一些東西,留給大家思考吧。

模擬意料之外的事務(wù)自動(dòng)提交

為了基于上面的測(cè)試數(shù)據(jù),讓兩條數(shù)據(jù)成功插入,我們?cè)跁?huì)話(huà) 2 中結(jié)束事務(wù)。

mysql commit;

然后開(kāi)始做意料之外的事務(wù)自動(dòng)提交測(cè)試,這一次我們?cè)谕粋€(gè)會(huì)話(huà)中測(cè)試即可。問(wèn)題的背景是如果我們顯式聲明事務(wù),在同一會(huì)話(huà)中做了 DML 操作,沒(méi)有提交,如果再開(kāi)啟一個(gè)事務(wù),之前的事務(wù)會(huì)自動(dòng)提交。

會(huì)話(huà) 1:

這是基于場(chǎng)景 1 的測(cè)試之后的數(shù)據(jù)情況。

mysql select *from test;

+——+——+

| id   | name |

+——+——+

| 2018 |  826 |

| 2017 |  827 |

+——+——+

2 rows in set (0.00 sec)

我們顯式聲明一個(gè)事務(wù)。

mysql begin;

Query OK, 0 rows affected (0.02 sec)

然后插入一條記錄,重新給一個(gè)日期。

mysql insert into test values(2019,825);

Query OK, 1 row affected (0.00 sec)

這個(gè)時(shí)候沒(méi)有提交,我們?cè)诋?dāng)前會(huì)話(huà)中重新再開(kāi)啟一個(gè)事務(wù)。

mysql begin;

mysql insert into test values(2015,830);

這個(gè)時(shí)候如果在會(huì)話(huà) 2 中查看,其實(shí)會(huì)發(fā)現(xiàn),事務(wù)已經(jīng)幫你提交了。

mysql select *from test;

+——+——+

| id   | name |

+——+——+

| 2018 |  826 |

| 2017 |  827 |

+——+——+

2 rows in set (0.00 sec)

在會(huì)話(huà) 1 我們繼續(xù)回滾事務(wù),會(huì)發(fā)現(xiàn)于事無(wú)補(bǔ)。

mysql rollback;

Query OK, 0 rows affected (0.01 sec)

這個(gè)時(shí)候數(shù)據(jù)已經(jīng)自動(dòng)提交了一部分。

mysql select *from test;

+——+——+

| id   | name |

+——+——+

| 2018 |  826 |

| 2017 |  827 |

+——+——+

2 rows in set (0.00 sec)

間隙鎖測(cè)試

上面的測(cè)試場(chǎng)景其實(shí)還是多多少少都有些關(guān)聯(lián),其中第一個(gè)場(chǎng)景和間隙鎖也有關(guān)系,我就簡(jiǎn)單用單表模擬一下間隙鎖。

首先還是保證事務(wù)隔離級(jí)別是 RR, 因?yàn)殚g隙鎖是 RR 隔離級(jí)別特供,RC 中就沒(méi)有間隙鎖這樣的定制,在并發(fā)場(chǎng)景中還是有不小的影響。我們來(lái)看看效果。

會(huì)話(huà) 1:

mysql begin;

Query OK, 0 rows affected (0.00 sec)

指定數(shù)據(jù)范圍,然后顯示聲明。

mysql select id from test where id 2019 lock in share mode;

+——+

| id   |

+——+

| 2018 |

| 2017 |

+——+

2 rows in set (0.00 sec)

會(huì)話(huà) 2:

會(huì)話(huà) 2 中也開(kāi)啟一個(gè)事務(wù),插入一條記錄。結(jié)果就被阻塞了。

mysql begin;

Query OK, 0 rows affected (0.00 sec)

mysql insert into test values(2016,829);

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

直到事務(wù)超時(shí)才作罷。

以上是“MySQL 單表模擬鎖的有哪些場(chǎng)景”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-27發(fā)表,共計(jì)2543字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 都昌县| 凤翔县| 土默特左旗| 湛江市| 双鸭山市| 凤城市| 闽清县| 淮北市| 依安县| 伊春市| 安西县| 荥经县| 徐闻县| 壶关县| 榆中县| 英山县| 绍兴市| 陵川县| 邵东县| 吕梁市| 瓮安县| 上虞市| 那坡县| 平乡县| 秭归县| 科技| 昌邑市| 会理县| 苍山县| 宜良县| 遂宁市| 宜君县| 浑源县| 交城县| 佛教| 盐亭县| 海阳市| 潜山县| 巴楚县| 云南省| 肇源县|