MySQL死鎖的兩個小案例
阿新 • • 發佈:2022-05-05
最近花了些時間分析MySQL鎖的內容,覺得越看越有意思。
我有個學習的習慣,有時候也不知道好還是不好,那就是喜歡直接上手練習,然後反過來練習理論。結果在學習鎖的時候,感覺多多少少走了一些彎路,那就是對鎖的基礎的概念有一些混淆,雖然能夠模擬出一些場景來,但是總是有一種隔靴搔癢的感覺,於是我就看了不少的部落格,多多少少會有一些正面負面的影響,結果讓我原本理解的地方又不大肯定了,所以這個時候捋一捋你學習的脈絡就很重要,通過實踐來得到結果,反推理論基礎是好事,但是很多不明確的理解就需要通讀官方文件了,這裡的知識自成體系,看完以後有種得了病要到病除的感覺,想必這種解決方法是生效了。
這部分內容還會繼續細化,有些測試場景做了很多,通過模擬測試也算是理清了一些含糊不清的地方。
文件比較大,我就列舉出一部分的內容來,有很多還沒有加入解讀。我稍後會加入批註,然後把內容加入到小密圈裡。
兩個死鎖的小例子:
死鎖案例1
比如自增列的死鎖,一般的死鎖得是4條DML語句互相牽制,我們可以做整合,簡化,使得死鎖的場景變得複雜起來。我們簡單來模擬一下。
create table t8 (c1 int auto_increment, c2 int default null, primary key(c1), unique key (c2) )ENGINE=InnoDB ; #session1 Begin; insert into t8 values(null,10); #session2 insert into t8 values(null,10); #session1 insert into t8 values(null,9);
死鎖案例2
比如我們難度升級,兩條delete語句導致的死鎖。
create Table: CREATE TABLE `d` ( `i` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`i`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; insert into d values(1); ##session1 mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> select *from d where i=1 lock in share mode; +---+ | i | +---+ | 1 | +---+ 1 row in set (0.00 sec) ##session2 mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> select *from d where i=1 lock in share mode; +---+ | i | +---+ | 1 | +---+ 1 row in set (0.00 sec) #session1 mysql> delete from d where i=1; Query OK, 1 row affected (10.80 sec) ##session2 mysql> delete from d where i=1; ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction mysql>