如何解决MySQL InnoDB Gap Lock on Update with where 子句 by PK?
我在更新操作中遇到了似乎彼此不相关的锁定。
这是数据库上下文:
- MySQL 5.7
- InnoDB 引擎
- 读取提交的隔离级别
- 应用中的乐观锁并发控制
表结构是这样的:
CREATE TABLE `external_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_id` bigint(20) NOT NULL,`status` varchar(30) NOT NULL,PRIMARY KEY (`id`),KEY `idx_user_status` (`status`),KEY `idx_user_id` (`user_id`) USING BTREE,);
结构已经简化。真正的有更多的属性和一些其他表的 FK。
过程是这样的:
流程 1
BEGIN;
update external_user
set user_id=33333
where (id in (400000,400002,400028.............,420000))
and user_id = 22222;
这是一个长时间运行的查询,修改了大约 20k 行。使用 between 不是一种选择,因为我们不会更新所有连续的记录。
同时开始第二个进程。
流程 2
BEGIN;
update external_user
set status='disabled',user_id = 44444
where id = 10000;
事实证明,第二次更新正在等待第一次完成。所以在第一个查询中持有一个锁。
我已经阅读了很多关于在 MySQL 中锁定的内容,但是我找不到任何关于在 where 子句中有一个带有 in 运算符的 PK 过滤器和另一个由具有非唯一索引的属性(即set 子句中也在更改)。
第一个查询是否因为非唯一索引过滤器而获得间隙锁?是否有可能?即使 PK 是作为过滤器提供的?
注意:我无权访问引擎以获取更详细的信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。