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
  • 所有的写操作,如 INSERTUPDATE 和 DELETE
  • 在 REPEATABLE READ 隔离级别下,第一次读取某个范围的数据后,再次读取相同范围的数据时,如果使用相同的索引,那么后续的读取将变成当前读。

总结

  • 快照读(Snapshot Read):提供了一致性视图,不加锁,适用于多数 SELECT 查询,在 READ COMMITTED 和 REPEATABLE READ 隔离级别下默认使用。
  • 当前读(Current Read):读取最新数据,可能加锁,适用于需要确保数据最新或需要锁定数据的操作。
posted @ 2024-07-01 10:10  使用D  阅读(4)  评论(0编辑  收藏  举报