0

MySQL 版本:5.7.29 Homebrew
ENGINE=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。请帮帮我。

4

1 回答 1

0

数据库状态的快照适用于事务中的 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.
于 2020-08-07T03:07:43.883 回答