mysql的当前读 和 快照读
当前读(current read)
总是读取 已经完成提交的最新的版本数据
触发场景
在执行有加锁的语句 如 update 和 lock in share mode 或 for update ,读的都是最新提交的数据。
实操
数据准备
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=41 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
select * from t_a;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | | 1 |
| 10 | | 10 |
| 20 | | 20 |
| 30 | | 30 |
| 40 | | 0 |
+----+------+-----+
set autocommit=0,设置为不自动提交事务
结论
表中的第7,就是普通读,(一致性读)前后读的都一样,
表中的第8,就是,当前读,使用 lock in share mode 对记录加锁,从而实现 读取提交完成的最新的版本数据。
一致性读(快照读)
事务中,普通的查询数据就是一致性读,不需要加锁的读(select xxx)
一致性读会根据 row tx_id 和 一致性视图确定数据版本的可见性
在 【可重复读-RR】事务隔离级别下,查询 只承认在 事务(tx_id)未开启前
,已经提交完成的数据
在 【读已提交-RC】事务隔离级别下,查询 只承认在语句未启动前
,已经提交完成的数据
注意 执行begin时并不会创建tx_id(事务)