最近我正在处理一个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 锁等待2锁结构,堆大小1136,1行锁 MySQL线程id 209,OS线程句柄123145559986176,查询id 6204本地主机根发送数据
select * from changeset where documentId = '7oO5C_v' and version >= 13 for update(1)等候批出该锁: 记录锁空间id 107页编号15 n位704索引uniq_documentId_version of tabletest.changesettrx id 22640 lock_mode x等待 记录锁,堆编号2物理记录: n_fields 3;紧凑格式;信息位0 0: len 7;Hex3976735431644a;asc 9vsT1dJ; 1: len 8;十六进制8000000000000000; 2: len 4;Hex051Cbef7; (2)交易: 事务22639,活动95秒插入 使用中的mysql表1,锁定1 6锁结构,堆大小1136,4行锁,撤消日志条目1 MySQL线程id 212,OS线程句柄123145561657344,查询id 6210本地主机根更新insert into changeset values (0, 9, '7oO5C_v', 814, 1, 13, 'x')(2)持有锁(S): 记录锁空间id 107页编号15 n位704索引uniq_documentId_version of tabletest.changesettrx id 22639 lock_mode x 记录锁,堆编号2物理记录: n_fields 3;紧凑格式;信息位0 0: len 7;Hex3976735431644a;asc 9vsT1dJ; 1: len 8;十六进制8000000000000000; 2: len 4;Hex051Cbef7; (2)等候批出该锁: 记录锁空间id 107页编号15n位704索引表uniq_documentId_versiontest.changesettrx id 22639 lock_mode x锁定空白前插入意图等待 记录锁,堆编号2物理记录: n_fields 3;紧凑格式;信息位0 0: len 7;Hex3976735431644a;asc 9vsT1dJ; 1: len 8;十六进制8000000000000000; 2: len 4;Hex051Cbef7; 我们回滚交易(1)
发布于 2018-12-29 07:26:10
你在你的选择中使用了"(nolock)“吗?
Select * From Table with (nolock)https://stackoverflow.com/questions/53966241
复制相似问题