【发布时间】:2009-10-19 19:35:13
【问题描述】:
我有一个包含用户的 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”。我不想要任何两个用户 ID 为 4 的 Bob。每个 Bob 的用户 ID 必须不同。
是否可以在运行上述插入查询时写入和更新锁定 Bob 的所有行?我无法锁定整个表,因为许多其他用户仍然需要完全访问他们的行。此外,所有行都应始终可读。我该怎么做?
【问题讨论】:
标签: sql mysql innodb rowlocking