这种僵局将如何发生?

时间:2018-12-29 02:36:55

标签: mysql sql

最近我正在处理一个SQL问题,我有两个事务,事务A首先获得了Next-Key锁,事务B试图获得相同的锁,所以它在等待,然后事务A试图获得插入意图锁,这样就发生了死锁。但是我感到困惑,为什么会这样?

这是我的表结构:

CREATE TABLE `changeset` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT',    
  `userId` int(10) NOT NULL COMMENT,    
  `documentId` varchar(20) NOT NULL,    
  `memberId` bigint(13) NOT NULL,    
  `createTime` bigint(13) NOT NULL,    
  `version` bigint(13) NOT NULL COMMENT,    
  `changesets` mediumtext,    
  PRIMARY KEY (`id`),    
  UNIQUE KEY `uniq_documentId_version` (`documentId`,`version`) USING BTREE    
) ENGINE=InnoDB AUTO_INCREMENT=85771623 DEFAULT CHARSET=utf8

这是我的死锁日志:

  

(1)交易:

     

TRANSACTION 22640,正在读取66秒的启动索引

     

正在使用的mysql表1,已锁定1

     

LOCK WAIT 2个锁结构,堆大小1136,1行锁

     

MySQL线程ID 209,操作系统线程句柄123145559986176,查询ID 6204   本地主机根发送数据

     

select * from changeset where documentId = '7oO5C_v' and version >= 13 for update

     

(1)等待授予此锁定:

     

记录锁空间ID 107页面编号15 n位704索引   表test的uniq_documentId_version。changeset trx ID 22640   lock_mode X等待中

     

记录锁,堆号2物理记录:n_fields 3;紧凑格式   信息位0

     

0:len 7;六角形3976735431644a; asc 9vsT1dJ ;;

     

1:len 8;十六进制8000000000000000;升序;;

     

2:len 4;十六进制051cbef7;升序;;

     

(2)交易:

     

TRANSACTION 22639,活动插入时间为95秒

     

正在使用的mysql表1,已锁定1

     

6个锁结构,堆大小1136、4个行锁,撤消日志条目1

     

MySQL线程ID 212,操作系统线程句柄123145561657344,查询ID 6210   本地主机根更新insert into changeset values (0, 9, '7oO5C_v', 814, 1, 13, 'x')

     

(2)持有锁:

     

记录锁空间ID 107页面编号15 n位704索引   表test的uniq_documentId_version。changeset trx id 22639   lock_mode X

     

记录锁,堆号2物理记录:n_fields 3;紧凑格式   信息位0

     

0:len 7;六角形3976735431644a; asc 9vsT1dJ ;;

     

1:len 8;十六进制8000000000000000;升序;;

     

2:len 4;十六进制051cbef7;升序;;

     

(2)等待授予此锁定:

     

记录锁空间ID 107页面编号15 n位704索引   表test的uniq_documentId_version。changeset trx id 22639   lock_mode X在等待记录插入意图之前锁定间隙

     

记录锁,堆号2物理记录:n_fields 3;紧凑格式   信息位0

     

0:len 7;六角形3976735431644a; asc 9vsT1dJ ;;

     

1:len 8;十六进制8000000000000000;升序;;

     

2:len 4;十六进制051cbef7;升序;;

     

我们回滚交易(1)

1 个答案:

答案 0 :(得分:0)

您在选择中使用了“(nolock)”吗?

Select * From Table with (nolock)