sql - MySQL InnoDB 只锁定受影响的行?

标签 sql mysql innodb rowlocking

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

最佳答案

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

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

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

关于sql - MySQL InnoDB 只锁定受影响的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1590648/

相关文章:

sql - JOIN 如何在数据库中工作的内部结构(SQL,比如在 MySQL 中)

php - 措辞棒球盒分数

php - php/mysql中sql查询中的多个类别与一篇文章

mysql - 当我们构建集群存储时,MyISAM 引擎是否比 InnoDB 更可取?为什么会这样?

MySQL innodb “The Table is Full” 错误

sql - WHEN_VALIDATE 触发器中的 GO_BLOCK

mysql - View 选择语句可以包含另一个 View 吗?

mysql - 将 MyISAM 转换为 InnoDB 数据库

java - RuntimeException : org. hibernate.exception.SQLGrammarException:无法执行查询

mysql - MySQL 的默认 ON DELETE 行为是什么?