在针对存在唯一索引的表中并发插入数据时,可能会触发死锁问题,今天我们就一起来探讨该死锁产生的原因。先准备测试案例,创建带有唯一索引的表A
1 | mysql> desc a; |
接下来开启三个事务,执行下列操作
- | 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 |