MySQL的InnoDB的锁只有受影响的行?(MySQL InnoDB locking only t

2019-08-21 00:29发布

我有一个包含用户,这样一个InnoDB表:

+--------------+-----------------------+
| user_id      | name                  |
+--------------+-----------------------+
| 1            | Bob                   |
| 1            | Marry                 |
| 2            | Bob                   |
| 1            | John                  |
| 3            | Bob                   |
| 2            | Marry                 |
+--------------+-----------------------+

每个插入件我由1,从而例如增加的user_id,鲍勃下一USER_ID将是4

我用这个查询做到这一点:

INSERT INTO users (user_id, name)
SELECT 1 + coalesce((SELECT max(user_id) FROM users WHERE name='Bob'), 0), 'Bob';

现在我需要确保两个不同的用户不会在同一时间增加一个“鲍勃”。 我不希望任何两个鲍勃与USER_ID 4.每个鲍勃的用户ID必须是不同的。

是否有可能在运行上述插入查询时编写和更新锁Bob的所有行? 我无法锁定整个表,因为其他许多用户仍然需要充分获得他们的行。 此外,所有的行应该在任何时候读取。 我会怎么做呢?

Answer 1:

这里假设的InnoDB,你可以使用SELECT ... LOCK IN SHARE MODE锁定行,当你选择它们。



Answer 2:

为了解决你的问题的第一部分,创建USER_ID和名称的唯一索引。

alter table `users` add unique index ak_user_id_name(user_id,name);

这将防止重复USER_ID,姓名记录。



Answer 3:

在这个问题的答案是一样的这一个 。 InnoDB的将在这里锁定更多的行比预期与基于语句的二进制日志的安全性。

解决办法:使用基于行的二进制日志记录与读取提交的隔离级别。



文章来源: MySQL InnoDB locking only the affected rows?