mysql - 如何故意锁定一个 MySQL 行,这样即使 SELECT 也会返回错误?

标签 mysql locking innodb

我正在尝试使用 MySQL 行锁定来基本上模拟行上的 MuteEx。假设我的表有 2 列,一个 id 和一个文本字段,以及三个条目 (1,a) (2,b) 和 (3,c)。 从表中选择 *;会返回这些结果。 我可以按正常方式锁定特定行。

START TRANSACTION;
BEGIN;
SELECT * FROM table WHERE id = '2' FOR UPDATE;

但是,如果从第二个连接我要从表中选择 *。它将返回所有 3 个结果。有没有一种行级锁定的方法可以基本上防止任何 SELECT 查看/使用锁定的行?基本上我试图阻止任何人使用当前正在使用/操作的行,或者甚至将该行视为其数据(因为它正在被使用/操作)在 SELECT 时不能被信任是准确的.

最佳答案

如果将事务隔离级别设置为 SERIALIZABLE , InnoDB将隐式附加 LOCK IN SHARE MODE所有 SELECT声明。

此模式与 SELECT FOR UPDATE 放置的锁冲突和 SELECT s 将锁定。

不过请注意,InnoDB可能锁定的行数多于满足 WHERE 的行数健康)状况。这是因为它会锁定所有已扫描 的行,而不仅仅是那些匹配 的行。

假设,您在 col1 上有一个索引这个查询:

SELECT  *
FROM    mytable
WHERE   col1 = 1
        AND col2 = 2
FOR UPDATE

使用这个索引。

这将用col1 = 1 锁定所有 记录, 即使是那些 col2 <> 2

关于mysql - 如何故意锁定一个 MySQL 行,这样即使 SELECT 也会返回错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2051225/

相关文章:

mysql - 更新查询 MySQL 时出现重复键输入

mysql - 如何计算 MySQL 中给定字符串的匹配数?

linux - Unix 中的强制锁定

php - 并发多用户访问php+mysql

mysql - 从 ibdata1 中恢复未连接的表

mysql - 存储过程变量未在 MySQL 中返回预期值?

php - 自动从mysql数据库更新php代码中的数据

java - 在 Clojure 的 Java 中使用锁定宏或监视器进入和监视器退出

c# - 线程安全的内存

mysql - 如果在 TRUNCATE 和 SELECT INTO 之间发送查询,则没有数据。使用 MySQL 数据库