Innodb死锁分析-案例3-插入意向锁与gap锁引起的.md

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sun_ashe/article/details/83542394

Innodb死锁分析-案例3

一、死锁日志

------------------------
LATEST DETECTED DEADLOCK
------------------------
2018-10-30 13:48:10 0x7eec74fc1700
*** (1) TRANSACTION:
TRANSACTION 2324559833, ACTIVE 1 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 30810915, OS thread handle 139554023008000, query id 6580658028 100.105.85.212 contractdb_rw update
insert into contract_record (
        contract_number,template_name,template_version,template_data,bucket,file_name,ext,create_time,update_time
     )
        values
        (
        '923572690382454787',
        '5b9b680949d6f61d0c1acb2d',
        '',
        '{"contract_data_contract_no":923572690382454787,"contract_data_jiekuan_no":"920984957118021641","contract_data_jiafang_id":"352229********2014","contract_data_jiafang_name":"\\u97e6\\u6807","contract_data_yifang_id":"441381********1220","contract_data_yifang_name":"\\u4e18\\u73c8\\u851a","contract_data_createTime":"2018\\u5e7410\\u670830\\u65e5","contract_data_amount":1200,"contract_data_rate":"24.00","extend_days":"7","contract_data_repayTime_year":"2018","contract_data_repayTime_month":"11","contract_data_repayTime_day":"06","contract_data_startTime_year":"2018","contract_data_startTime_month":"10","contract_data_startTime_day":"31",
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 2063 page no 17096524 n bits 528 index u_contract_number of table `contractdb`.`contract_record` trx id 2324559833 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 244 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 7; hex 3932336c6f616e; asc 923loan;;
 1: len 8; hex 000000000c645cf7; asc      d\ ;;

*** (2) TRANSACTION:
TRANSACTION 2324559830, ACTIVE 1 sec inserting
mysql tables in use 1, locked 1
4 lock struct(s), heap size 1136, 3 row lock(s), undo log entries 1
MySQL thread id 30811380, OS thread handle 139554040059648, query id 6580657547 100.109.50.41 contractdb_rw update
insert into contract_record (
        contract_number,template_name,template_version,template_data,bucket,file_name,ext,create_time,update_time
     )
        values
        (
        '923572692257296392',
        '5b9b680949d6f61d0c1acb2d',
        '',
        '{"contract_data_contract_no":923572692257296392,"contract_data_jiekuan_no":"920728728382693379","contract_data_jiafang_id":"441423********333X","contract_data_jiafang_name":"\\u5f90\\u798f\\u5764","contract_data_yifang_id":"130626********003X","contract_data_yifang_name":"\\u738b\\u632f","contract_data_createTime":"2018\\u5e7410\\u670830\\u65e5","contract_data_amount":600,"contract_data_rate":"0.00","extend_days":"4","contract_data_repayTime_year":"2018","contract_data_repayTime_month":"11","contract_data_repayTime_day":"03","contract_data_startTime_year":"2018","contract_data_startTime_month":"10","contract_data_startTime_day":"31","re
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 2063 page no 17096524 n bits 528 index u_contract_number of table `contractdb`.`contract_record` trx id 2324559830 lock_mode X locks gap before rec
Record lock, heap no 244 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 7; hex 3932336c6f616e; asc 923loan;;
 1: len 8; hex 000000000c645cf7; asc      d\ ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 2063 page no 17096524 n bits 528 index u_contract_number of table `contractdb`.`contract_record` trx id 2324559830 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 244 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 7; hex 3932336c6f616e; asc 923loan;;
 1: len 8; hex 000000000c645cf7; asc      d\ ;;

*** WE ROLL BACK TRANSACTION (1)

二、表结构

mysql> show create table contractdb.contract_record\G
*************************** 1. row ***************************
       Table: contract_record
Create Table: CREATE TABLE `contract_record` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `contract_number` varchar(128) DEFAULT NULL,
  `template_name` varchar(128) DEFAULT
  PRIMARY KEY (`id`),
  UNIQUE KEY `u_contract_number` (`contract_number`),
  KEY `ix_create_time` (`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=403854439 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

三、死锁分析

看到死锁后,首先关注的就是如上列出的这两点信息,一个是死锁日志,一个是相关表的表结构。

从死锁日志中可以得到如下信息

  • 事务1 等待 heap no为244这个索引元组(u_contract_number)的排他间隙锁,并且附带插入意向属性。
  • 事务2 拥有 heap no为244这个索引元组(u_contract_number)的排他间隙锁,
  • 事务2 等待 heap no为244这这个索引元组(u_contract_number)的排他间隙锁,并且附带插入意向属性。

所以这个死锁是因为插入意向锁与gap锁不兼容导致的死锁冲突。即便插入的u_contract_number值不一样。

死锁过程猜测是如下这样

事务1 通过某种手段(比如说for update)获取heap no为244 的X gap锁
事务2 通过某种手段(比如说for update)获取heap no为244 的X gap锁
事务1 插入数据,陷入锁等待
事务2 插入数据,触发死锁检测。

当然这只是猜测,具体还需要跟RD确认。

猜你喜欢

转载自blog.csdn.net/sun_ashe/article/details/83542394