基于主键选择的mysql更新

时间:2018-11-05 10:19:39

标签: mysql locks

嘿,我在对项目进行更新时遇到间隙锁定 我创建了类似的表格,可能有助于解释我的问题

我的桌子

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,我希望保持这种状态

我将不胜感激

0 个答案:

没有答案