mysql的mvcc机制中,read view是什么时候生成的?
在 MySQL 的 Read Committed (RC) 隔离级别下,读视图(Read View) 的生成遵循以下原则:
RC 隔离级别下 Read View 的生成时机
在 RC 隔离级别中,每次执行**快照读(Snapshot Read)**时都会生成一个新的 Read View
,而不会在事务开始时就固定一个 Read View
。这意味着:
-
每个查询都会生成一个新的 Read View:
- 每次执行
SELECT
查询时,都会获取当前数据库的最新提交版本。 - 查询不会受到事务中前一次查询的
Read View
的限制。
- 每次执行
-
与事务的写操作无关:
- 即使事务已经执行过写操作 (
INSERT
,UPDATE
,DELETE
),后续的读操作依然会基于最新的已提交数据生成新的Read View
。
- 即使事务已经执行过写操作 (
RC 与 Read View 的关键点
- 实时性:RC 隔离级别确保每次查询都能读取到其他事务已经提交的最新数据。
- 快照独立性:RC 的每次查询生成的
Read View
是独立的,与事务其他查询生成的Read View
无关。 - 不可重复读:由于每次查询生成的
Read View
不同,同一事务中的两次查询可能读取到不一致的数据(即不可重复读)。
RC 隔离级别下 Read View 的作用
在 RC 中,Read View
的主要作用是:
- 避免读取未提交的数据(防止脏读)。
- 每次查询的
Read View
确保只读取其他事务已经提交的数据版本。
对比 RR 隔离级别
在 Repeatable Read (RR) 隔离级别下:
Read View
只在事务的第一次快照读时生成。- 整个事务中后续的快照读共享相同的
Read View
。 - 保证了同一事务内的可重复读。
而在 RC 中,每次查询的 Read View
独立生成,因此可能导致不可重复读。
总结
在 Read Committed (RC) 隔离级别下:
Read View
是在每次执行快照读时生成的,而不是在事务开始时固定生成。- 这一机制确保了事务每次查询可以看到最新的已提交数据,同时也导致了不可重复读的现象。