【问题标题】:MySQL MVCC 2 transictions update one row, select the snapshot questionMySQL MVCC 2 事务更新一行,选择快照问题
【发布时间】:2020-11-27 08:32:25
【问题描述】:

MySQL 版本:5.7.29 Homebrew
引擎=InnoDB
可重复阅读

MVCC 快照问题:
表:

CREATE TABLE `r` (
  `id` int NOT NULL primary key auto_increment,
  `v` int not null
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  
  insert into r values (1,1);
  

步骤:

-----事务A -------------|交易B
--------------------------------|----------------- ----------
------开始;-----------------| --
1、select * from r;-------------| --
--------------------------------|开始;
--------------------------------|更新 r 设置 v=v+1 其中 id = 1;
--------------------------------|提交;
2、select * from r;-------------| --
更新 r 设置 v=v+1 其中 id = 1;| --
3、select * from r;-------------| --
----------提交;----------------| --

第 1 步和第 2 步 v = 1,但为什么第 3 步 v = 3,因为 MVCC 我认为 v 应该是 2。请帮帮我。

【问题讨论】:

  • 我猜是因为插入和更新操作是当前读取?当前红色表示总是获取最新值。但是我怀疑这个插入操作是否对事务中的其他操作有影响?

标签: mysql database mvcc


【解决方案1】:

数据库状态的快照适用于事务中的 SELECT 语句,不一定适用于 DML 语句。如果您插入或修改某些行然后提交该事务,则从另一个并发 REPEATABLE READ 事务发出的 DELETE 或 UPDATE 语句可能会影响那些刚刚提交的行,即使会话无法查询它们。如果一个事务确实更新或删除了由不同事务提交的行,那么这些更改对当前事务是可见的。例如,您可能会遇到如下情况:

SELECT COUNT(c1) FROM t1 WHERE c1 = 'xyz';
-- Returns 0: no rows match.
DELETE FROM t1 WHERE c1 = 'xyz';
-- Deletes several rows recently committed by other transaction.

SELECT COUNT(c2) FROM t1 WHERE c2 = 'abc';
-- Returns 0: no rows match.
UPDATE t1 SET c2 = 'cba' WHERE c2 = 'abc';
-- Affects 10 rows: another txn just committed 10 rows with 'abc' values.
SELECT COUNT(c2) FROM t1 WHERE c2 = 'cba';
-- Returns 10: this txn can now see the rows it just updated.

【讨论】:

    猜你喜欢
    • 2017-03-12
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    相关资源
    最近更新 更多