【问题标题】:Why locking read ignore isolation level?为什么锁定读取忽略隔离级别?
【发布时间】:2021-05-05 00:58:36
【问题描述】:

例子:

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT * FROM t1; // to "create shapshot". For simplicity t1 contains 1 row 1 column which contains value 1.
// another transaction updates this row and change 1 to 2 and commits.
SELECT * FROM t1; // we see no changes. As expected in repeatable read.
SELECT * FROM t1 FOR UPDATE; // i see change row. Why?

我无法找到对这种行为的解释。为什么锁读忽略隔离级别?

【问题讨论】:

  • 请注意,在 FOR UPDATE 之后添加的 SELECT * FROM t1; 仍然返回值 1。我可以理解它为什么会这样工作,但这有点令人惊讶。
  • 这是我的预期行为

标签: mysql sql database transactions


【解决方案1】:

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html 说:

SELECT ... FOR UPDATE

对于搜索遇到的索引记录,锁定行和任何关联的索引条目,就像您为这些行发出 UPDATE 语句一样。其他事务被阻止更新这些行、执行 SELECT ... FOR SHARE 或读取某些事务隔离级别的数据。一致读取忽略读取视图中存在的记录上设置的任何锁定。 (旧版本的记录不能被锁定;它们是通过在记录的内存副本上应用撤消日志来重建的。)

换句话说,锁定读取只能锁定行的最新提交版本。

【讨论】:

猜你喜欢
  • 2015-05-20
  • 2011-11-10
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
相关资源
最近更新 更多