mysql的当前读和快照读

317 阅读1分钟

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,设置为不自动提交事务

image.png

结论

表中的第7,就是普通读,(一致性读)前后读的都一样,

表中的第8,就是,当前读,使用 lock in share mode 对记录加锁,从而实现 读取提交完成的最新的版本数据。

一致性读(快照读)

事务中,普通的查询数据就是一致性读,不需要加锁的读(select xxx)

一致性读会根据 row tx_id 和 一致性视图确定数据版本的可见性

在 【可重复读-RR】事务隔离级别下,查询 只承认在 事务(tx_id)未开启前,已经提交完成的数据

在 【读已提交-RC】事务隔离级别下,查询 只承认在语句未启动前,已经提交完成的数据

注意 执行begin时并不会创建tx_id(事务)