最近我在处理一个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)
1条答案
按热度按时间nbysray51#
你的选择中用过“(nolock)”吗?