我正在尝试使用 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/