0%

MySQL死锁分析(一)

在针对存在唯一索引的表中并发插入数据时,可能会触发死锁问题,今天我们就一起来探讨该死锁产生的原因。先准备测试案例,创建带有唯一索引的表A

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> desc a;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | UNI | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.01 sec)

mysql> select * from a;
+------+
| id |
+------+
| 1 |
| 5 |
+------+

接下来开启三个事务,执行下列操作

- SESSION 1 SESSION 2 SESSION 3
1 begin;
insert into a select 4;
2 begin;
insert into a select 4;
begin;
insert into a select 4;
3 rollback; Deadlock found when trying to get lock

可以发现在SESSION 1执行rollback的同时,SESSION 3立刻出现死锁并返回。接下来我们结合show engine innodb status中的锁信息来对这个死锁问题进行分析。先把参数innodb_status_output_locks打开,这样才能在show enginge innodb status中查看详细的锁信息。

1
2
3
4
5
6
7