这种死锁是如何发生的?

35g0bw71  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(251)

最近我在处理一个sql问题,我有两个事务,事务a首先得到下一个密钥锁,事务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) 交易:
事务22640,活动66秒开始索引读取
使用中的mysql表1,已锁定1
lock wait 2锁结构,堆大小1136,1行锁
mysql线程id 209,os线程句柄123145559986176,查询id 6204 localhost root发送数据 select * from changeset where documentId = '7oO5C_v' and version >= 13 for update (1) 正在等待授予此锁:
记录锁定空间id 107第15页n位704索引uniq\u documentid\u表的版本 test . changeset trx id 22640锁定模式x等待
记录锁,堆号2物理记录:n\u字段3;压缩格式;信息位0
0:长度7;六角扳手3976735431644a;asc 9vst1dj;;
1:长度8;十六进制80000000000000;asc;;
2:长度4;六角螺母051cbef7;asc;;
(2) 交易:
事务22639,活动95秒
使用中的mysql表1,已锁定1
6个锁结构,堆大小1136,4个行锁,撤消日志条目1
mysql线程id 212,os线程句柄123145561657344,查询id 6210 localhost根更新 insert into changeset values (0, 9, '7oO5C_v', 814, 1, 13, 'x') (2) 保持锁定:
记录锁定空间id 107第15页n位704索引uniq\u documentid\u表的版本 test . changeset trx id 22639锁定模式x
记录锁,堆号2物理记录:n\u字段3;压缩格式;信息位0
0:长度7;六角扳手3976735431644a;asc 9vst1dj;;
1:长度8;十六进制80000000000000;asc;;
2:长度4;六角螺母051cbef7;asc;;
(2) 正在等待授予此锁:
记录锁定空间id 107第15页n位704索引uniq\u documentid\u表的版本 test . changeset trx id 22639 lock\u mode x locks gap before rec insert意图等待
记录锁,堆号2物理记录:n\u字段3;压缩格式;信息位0
0:长度7;六角扳手3976735431644a;asc 9vst1dj;;
1:长度8;十六进制80000000000000;asc;;
2:长度4;六角螺母051cbef7;asc;;
我们回滚事务(1)

nbysray5

nbysray51#

你的选择中用过“(nolock)”吗?

Select * From Table with (nolock)

相关问题