MySQL InnoDB 仅锁定受影响的行?
-
22-09-2019 - |
题
我有一个包含用户的 InnoDB 表,如下所示:
+--------------+-----------------------+
| user_id | name |
+--------------+-----------------------+
| 1 | Bob |
| 1 | Marry |
| 2 | Bob |
| 1 | John |
| 3 | Bob |
| 2 | Marry |
+--------------+-----------------------+
在每次插入时,我将 user_id 加 1,例如,Bob 的下一个 user_id 将是 4
我使用这个查询来做到这一点:
INSERT INTO users (user_id, name)
SELECT 1 + coalesce((SELECT max(user_id) FROM users WHERE name='Bob'), 0), 'Bob';
现在我需要确保两个不同的用户不会同时添加“Bob”。我不想要任何两个 user_id 为 4 的 Bob。Bob 的每个用户 ID 必须不同。
当运行上述插入查询时,是否可以写入和更新锁定 Bob 的所有行?我无法锁定整个表,因为许多其他用户仍然需要对其行的完全访问权限。此外,所有行都应该始终可读。我该怎么做?
解决方案
在这里假设的InnoDB,你可以使用 SELECT。 .. LOCK IN SHARE模式当选择它们以锁定的行。
其他提示
要解决您的问题的第一部分, 创建USER_ID和名称的唯一索引。
alter table `users` add unique index ak_user_id_name(user_id,name);
这将防止重复USER_ID,姓名记录。
这个问题的答案与 这个. 。InnoDB 将在此处锁定比您预期的更多的行,以确保基于语句的二进制日志记录的安全性。
解决方案: 使用基于行的二进制日志记录和已提交读隔离级别。
不隶属于 StackOverflow