mysql读视图,快照读,普通读
在 MySQL 数据库中,尤其是使用 InnoDB 存储引擎时,读取数据时可以采用不同的方式,这些方式主要基于事务隔离级别和多版本并发控制(MVCC)。主要的读取类型包括快照读(Snapshot Read)、当前读(Current Read)和普通读(Consistent Read),其中快照读和普通读通常指的是同一种读取方式。
快照读(Snapshot Read)/ 普通读(Consistent Read)
快照读是指在读取数据时,数据库会提供一个在过去某个时刻的一致性视图(即快照),而不是数据的最新版本。这意味着读取操作不会阻塞写操作,也不会被写操作阻塞,读取操作不加锁,因此不会引起死锁。快照读是通过 MVCC 实现的,它允许事务看到在事务开始时存在的数据版本,而不管后来是否有其他事务进行了更改。
在以下隔离级别中,普通的 SELECT 语句默认使用快照读:
- 读已提交(Read Committed, RC):在这个隔离级别下,每个 SELECT 都能看到其他事务提交后的最新数据,但实际上,InnoDB 仍会使用快照读,只不过快照包含了所有已提交的事务数据。
- 可重复读(Repeatable Read, RR):在这个隔离级别下,一旦事务开始,其快照读将始终看到事务开始时的数据版本,即使有其他事务在此期间提交了更改。
当前读(Current Read)
当前读是指读取数据时必须读取到数据的最新版本,也就是说读取的是当前事务可见的最新数据。当前读在读取数据时可能会被写操作阻塞,直到写操作完成,这是因为当前读通常需要对数据加锁。
以下操作会触发当前读:
- 所有带锁的读取操作,如
SELECT ... LOCK IN SHARE MODE
和SELECT ... FOR UPDATE
。 - 所有的写操作,如
INSERT
、UPDATE
和DELETE
。 - 在
REPEATABLE READ
隔离级别下,第一次读取某个范围的数据后,再次读取相同范围的数据时,如果使用相同的索引,那么后续的读取将变成当前读。
总结
- 快照读(Snapshot Read):提供了一致性视图,不加锁,适用于多数 SELECT 查询,在
READ COMMITTED
和REPEATABLE READ
隔离级别下默认使用。 - 当前读(Current Read):读取最新数据,可能加锁,适用于需要确保数据最新或需要锁定数据的操作。
收藏文章数量从多到少与“把书读薄”是一个道理