资讯动态

面试官:什么是快照读?什么是当前读?有什么区别?

发布时间:2026/10/16 3:03:56 来源:尧图企业网站定制
使用 MySQL 时我们经常会听到快照读、当前读这样的概念今天我们就来聊一聊快照读、当前读。快照读和当前读主要区别在于是否读取到最新提交的数据是否需要加锁它们对数据库的并发性能有所不同。1.快照读快照读读取的是数据的快照通过读视图提供非阻塞读取代替加锁机制提高并发性能。我们知道MySQL 事务隔离级别有 4 个串行化Serializable事务对数据读写都是串行化的。可重复读Repeatable Read事务执行过程中多次读取同一行数据读取结果一致。MySQL 默认隔离级别就是可重复读。读已提交数据Read Committed事务执行过程中如果有其他事务修改了数据并且提交事务当前事务可以读取到最新提交的数据。读未提交数据Read Uncommitted事务执行过程中可以读取到其他事务未提交的数据。其中可重复读和读已提交数据依托 MVCC多版本并发控制实现了快照读。不同的是可重复读是在事务开始时创建视图每个事务就使用一个快照所以多次读取结果是一样的看不到新提交的数据。而读已提交是在每次语句执行前创建新的视图所以能读取到新提交的数据。比如有一张表 t_acct其中有 idaccount、amount 三个字段在一个事务中有一条 SQL 语句被执行了 3 次select amount from t_acct where id10;在可重复读隔离级别下读取到的数据如下:在读已提交隔离级别下读取到的数据如下图总结快照读的特点就是读取视图数据不加锁非阻塞执行 SQL 语句一般是简单查询SELECT xxx FROM table WHERE 条件2.当前读跟快照读对应的就是当前读特点是读取数据最新提交的版本在读取时会对数据进行加锁以防止其他事务并发修改这条数据。优点是强一致可以读取到数据最新版本防止丢失更新。缺点是有加锁带来的阻塞和性能损耗。当前读涉及的 SQL 如下SELECT xxx FROMTABLELOCKINSHAREMODE (共享锁); SELECT xxx FROMTABLEFORUPDATE (排它锁) UPDATETABLEset xxx (更新前先加排它锁) DELETEFROMTABLEWHERE xxx (删除前先加排它锁) INSERTINTOTABLE xxx (加排它锁)3.总结当前读和快照读的区别总结如下差异点快照读当前读数据版本基于快照不一定最新最新提交版本是否加锁不加加锁一致性可能有不一致情况强一致并发性强可能有阻塞实现原理MVCC数据库锁适用隔离级别可重复读、读已提交全部对于简单的数据查询不要求查询最新提交数据可以考虑使用快照读。如果要求读取到最新提交数据那就考虑使用当前读。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑