MySQL InnoDB是否仅锁定受影响的行?

MySQL InnoDB是否仅锁定受影响的行?,sql,mysql,innodb,rowlocking,Sql,Mysql,Innodb,Rowlocking,我有一个包含用户的InnoDB表,如下所示: +--------------+-----------------------+ | user_id | name | +--------------+-----------------------+ | 1 | Bob | | 1 | Marry | | 2 | Bob

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

假设InnoDB在这里,您可以在选择行时使用它来锁定行。

要解决问题的第一部分, 在用户id和名称上创建唯一索引

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

这将防止重复的用户id、姓名记录。

此问题的答案与相同。使用基于语句的二进制日志记录,InnoDB将在此处锁定比您预期的更多的行


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

但是用户id行中可以有多个1,但每个1都属于不同的用户。就像可以有多个Bob,但每个Bob都有不同的用户ID。这并不能阻止这种情况。它是一个由用户名和用户名组成的复合密钥。它防止输入重复的用户名/名称组合。所以1/bob,1/sue,2/bob都可以。放入另一个1/bob将导致数据库错误。共享模式下的AFAIK锁还不够,您必须{{LOCK TABLE}}或创建uniq索引,如果更新失败,请作为@TXOJI应答重试更新。