MySQL:您必须明确说明必须锁定哪一行还是 INNODB 只知道这一点?

标签 mysql innodb

我知道 INNODB 有行级锁定。所以如果我这样做:

LOCK TABLES users WRITE
SELECT credits FROM users WHERE userid = 1;
UPDATE users SET credits = ([CREDITS] + 100) WHERE userid = 1;
UNLOCK TABLES

innoDB 是否足够聪明,可以在那一秒仅锁定该行,或者我必须采取其他步骤才能仅锁定该行? innodb 如何知道在我的持续时间内只锁定这个用户?它是否已按应有的方式锁定在 SELECT 处?

最佳答案

如果您创建表,则无需自行锁定表 使用选项 Engine = InnoDB 将创建 InnoDB 监视器。

CREATE TABLE t (i INT) ENGINE = InnoDB;

监视器自动锁定表,但锁定不是针对单行 InnoDB 会为操作/事务锁定空表。

也许用户只想读取表,他获得了孔表上的锁。 同时其他用户也可以读取该表,但如果他想要删除一行并请求 x 锁,他必须等待其他用户,直到他释放 s 锁。

MYSQL 锁类型兼容性矩阵。

    X           IX            S          IS
X   Conflict    Conflict    Conflict    Conflict
IX  Conflict    Compatible  Conflict    Compatible
S   Conflict    Conflict    Compatible  Compatible
IS  Conflict    Compatible  Compatible  Compatible

请阅读mysql文档:

InnoDB 监视器 - http://dev.mysql.com/doc/refman/5.1/en/innodb-monitors.html

InnoDB 锁定模式 - http://dev.mysql.com/doc/refman/5.1/en/innodb-lock-modes.html

关于MySQL:您必须明确说明必须锁定哪一行还是 INNODB 只知道这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15804264/

相关文章:

php - 选择、检查日期和插入的 MySQL 存储过程

php - 将秒数相加

mysql - 如何加速 InnoDB count(*) 查询?

sql - 如果有评论,我的 SQL 只会带来结果

mysql - Spring Boot 2.0.x 上的 InnoDB?

mysql - 优化复杂的 SQL 查询 - 避免经常运行子查询

mysql - MariaDB 字符编码

java - 如何使用配置文件连接到 Spring 中的数据库?

mysql - 为什么 Mysql 重命名我的外键?

mysql - 更快的服务器响应