這篇文章主要介紹MySQL單表模擬鎖的有哪些場(chǎng)景,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的利津網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
在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)模擬這類而是可以嗎,其實(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)稱為會(huì)話1,會(huì)話2.
模擬死鎖
我們開(kāi)始先模擬一下死鎖問(wèn)題。
會(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ì)話2;
mysql> insert into test values(2016,827);
這個(gè)時(shí)候會(huì)話2會(huì)阻塞,這個(gè)時(shí)候有一種特殊的情況,那就是阻塞超時(shí),如果超時(shí),會(huì)自動(dòng)停止。
會(huì)話1:
mysql> insert into test values(2018,826);
Query OK, 1 row affected (0.00 sec)
可見(jiàn)會(huì)話1中的DML操作依舊是可以的。
會(huì)話2:
mysql> insert into test values(2016,827);
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
如果看會(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)有直接的依賴關(guān)聯(lián),怎么會(huì)產(chǎn)生死鎖,這個(gè)里面有銀式鎖升級(jí),還有間隙鎖的一些東西,留給大家思考吧。
模擬意料之外的事務(wù)自動(dòng)提交
為了基于上面的測(cè)試數(shù)據(jù),讓兩條數(shù)據(jù)成功插入,我們?cè)跁?huì)話2中結(jié)束事務(wù)。
mysql>commit;
然后開(kāi)始做意料之外的事務(wù)自動(dòng)提交測(cè)試,這一次我們?cè)谕粋€(gè)會(huì)話中測(cè)試即可。問(wèn)題的背景是如果我們顯式聲明事務(wù),在同一會(huì)話中做了DML操作,沒(méi)有提交,如果再開(kāi)啟一個(gè)事務(wù),之前的事務(wù)會(huì)自動(dòng)提交。
會(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ì)話中重新再開(kāi)啟一個(gè)事務(wù)。
mysql > begin;
mysql > insert into test values(2015,830);
這個(gè)時(shí)候如果在會(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ì)話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ì)話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ì)話2:
會(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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
文章題目:MySQL單表模擬鎖的有哪些場(chǎng)景
網(wǎng)頁(yè)鏈接:http://jinyejixie.com/article46/iepohg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)頁(yè)設(shè)計(jì)公司、手機(jī)網(wǎng)站建設(shè)、App設(shè)計(jì)、小程序開(kāi)發(fā)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)