mysql的RR和RC的read view
可重复读(RR)
read view 的创建时机,begin; 之后执行第一条sql,此时就会创建一个 read view视图 和 一个 事务id(直到commit结束)
该 read view的查询结果会保持不变直到 改事务结束。
CREATE TABLE `t_a` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL DEFAULT '',
`age` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `idx_age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
mysql> select * from t_a;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 1 |
+----+------+-----+
实践
read view视图是 begin的时候创建的,还是执行begin后的。第一条sql语句创建的?
结论
执行begin后的。第一条sql语句创建的
如果是 session1的begin的是开的,那么在 session2 commit后, session1在查询 name应该是 "a"才对,
很明显,session1查询的结果是 name=”a1“,则说明 read view视图不是在 begin后立马创建的,而是在 begin 后执行的第一天sql是创建的
执行的sql 没有强调必须是 select,其他的也可以。
读已提交(RC)
read view 每次创建时机,
begin后,每次执行查询语句,都会查询获取最新事务提交的数据。作为 改事务最新的read view。