快照读、当前读是什么?
快照读、当前读是什么?
提示
题眼: 快照读什么时候升级为当前读
快照读(Snapshot Read)和当前读(Current Read)是数据库中两种常见的读取数据的方式。
快照读(Snapshot Read):快照读是指读取数据库中某个时间点的数据快照。当进行快照读取时,读取的数据是在事务开始之前的一个一致的时间点的数据。这意味着无论事务中的其他并发操作是否已提交,快照读取都会返回事务开始之前的数据版本。快照读取不会受到正在进行的并发事务的修改的影响,能够提供一致性和可重复性的读取。
当前读(Current Read):当前读是指读取数据库中最新的数据,即读取已经提交的事务所做的修改。当前读取获取的是实时的、最新的数据状态。如果存在并发事务对读取的数据进行修改但尚未提交,当前读取将能够看到这些未提交的修改。当前读取适用于需要读取最新状态的场景,但可能会受到并发事务的影响,因为读取到的数据可能会在事务提交之后发生变化。
重要
参考答案:
快照读是一种不加锁的非阻塞读,它是基于MVCC来实现的。一般情况下,不加锁的SELECT操作都是快照读,他就相当于再操作数据库的时候给所有表的数据拍了张照片,后续所有的读操作都基于这张照片进行,不同的事务有各自独立的照片,大家互相操作,互不影响。这样不会有并发问题,但是只能进行读操作,如果要修改某个数据,这个时候就会升级到当前读。另外,快照读有可能拿不到最新提交的数据,这一点在业务开发的时候可能需要注意下。比如A在读配置,B刚好同时修改了某个配置,但是A没有立即拿到,可能要等下一次读取的时候才会拿到。
当前读,就是写操作或者加锁的时候,会直接开启当前读,也就是操作真实的数据表,这个时候会对数据进行加锁,保证其他事务不会操作当前的数据。另外,如果隔离级别是串行化的话,那么所有操作都直接开启当前读,就没有快照读了。
