最近我正在处理一个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)
答案 0 :(得分:0)
您在选择中使用了“(nolock)”吗?
Select * From Table with (nolock)