嘿,我在对项目进行更新时遇到间隙锁定 我创建了类似的表格,可能有助于解释我的问题
我的桌子
CREATE TABLE `test_task` (
`pk` bigint(20) NOT NULL AUTO_INCREMENT,
`parent_pk` bigint(20) NOT NULL,
`msg` varchar(100) NOT NULL,
`status` int(4) NOT NULL DEFAULT '1',
PRIMARY KEY (`pk`),
KEY `parent_pk` (`parent_pk`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
数据
INSERT INTO `test_task` (`parent_pk`, `msg`, `status`)
VALUES ('1234566', 'left', '1'),
('1234566', 'left', '1'),
('1234567', 'right', '1'),
('1234567', 'top', '1'),
('1234567', 'bottom', '1'),
('1234567', '980', '1'),
('1234566', 'left', '1')
正在运行的当前查询会导致锁定
update test_task
set status = 0
where parent_pk = 1234567 and
msg = 'left'
我现在的解决方案就是这个
update test_task
set status = 0
where pk in (select c.pk
from (Select pk
from test_task
where parent_pk = '1234567' and
msg = 'left') c )
我的问题是,现在我将基于主键进行更新,因为我们仍然具有数据库锁。锁定发生在值的插入和更新期间
当前的数据库隔离级别为REPEATABLE_READ
,我希望保持这种状态
我将不胜感激