【发布时间】:2013-11-24 10:07:30
【问题描述】:
我在 MySQL 5.6.13 上运行这些查询。 我使用可重复的读取隔离级别。该表如下所示:
在会话 A 终端中我发布了以下声明
UPDATE manufacurer
SET lead_time = 2
WHERE mname = 'Hayleys';
在 Session B 终端中,我尝试将 ACL Cables 的值 lead_time 更新为 2。但由于 Session A 的前一个 UPDATE 命令尚未提交(并且 Session A 在制造商表上具有排他锁),所以此更新等待。这个我能理解。
但是当我尝试在会话 B 上执行如下的 SELECT 语句时,
SELECT * FROM manufacturer
WHERE mcode = 'ACL';
它正确地查询制造商表并给出行。这怎么可能发生?因为会话 A 仍然持有制造商表上的排他锁,并且据我所知,当一个表上持有排他锁时,在提交前一个事务之前,没有其他事务可以读取或写入它。 p>
【问题讨论】:
-
在您的问题标题中,您区分了读取和写入锁,而在问题中您谈到了防止读取和写入的锁。请更新您的问题/标题以保持一致性。
-
由于您没有修改 Session B 中的行。返回数据。
-
@KayNelson Umm..如果我理解正确,即使我没有修改行,我仍在尝试从中读取,并且独占锁不允许其他会话读取或写入 直到前一个事务被提交。
-
你使用innodb作为引擎吗?
-
@Thili InnoDB 提供行级锁定。您的
UPDATE仅触及WHERE mname = 'Hayleys'行。您的 SELECT 用于不同行中的数据WHERE mcode = 'ACL'。因此,该行可以安全读取 - 尽管这也取决于您的表上有哪些索引 - 比更新的行更多的行可能会被锁定。
标签: mysql innodb isolation-level readwritelock