3

我有一个包含用户的 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 的所有行?我无法锁定整个表,因为许多其他用户仍然需要完全访问他们的行。此外,所有行都应始终可读。我该怎么做?

4

3 回答 3

3

要解决问题的第一部分,请在 user_id 和 name 上创建一个唯一索引。

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

这将防止重复的 user_id,name 记录。

于 2009-10-19T19:49:53.150 回答
3

这个问题的答案和这个一样。InnoDB 将在此处锁定比您预期的基于语句的二进制日志记录的安全性更多的行。

解决方案:使用具有已提交读隔离级别的基于行的二进制日志记录。

于 2011-08-30T14:57:24.083 回答
2

假设这里是 InnoDB,您可以在选择行时使用SELECT ... LOCK IN SHARE MODE锁定行。

于 2009-10-19T19:44:19.997 回答