1. 程式人生 > 其它 >MySQL死鎖的兩個小案例

MySQL死鎖的兩個小案例

最近花了些時間分析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>