当前读

        读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加 锁。对于我们日常的操作,如:select ... lock in share mode(共享锁),select ... for update、update、insert、delete(排他锁)都是一种当前读。

由此可知,当前读通过next-key来解决幻读问题。

快照读

        简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据, 不加锁,是非阻塞读。

  • Read Committed:每次select,都生成一个快照读,
  • Repeatable Read:开启事务后第一个select语句才是快照读的地方。
  • Serializable:快照读会退化为当前读。

        快照读sql提取的数据是MVCC根据readview来选择的。不同的隔离级别,生成ReadView的时机不同:

  • READ COMMITTED :在事务中每一次执行快照读时生成ReadView。
  • REPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。

在RR的隔离级别下下,快照读本身就解决了幻读问题。

即在RR的隔离级别下,MVCC和锁一起解决了幻读问题

事务的四大特性

  •  原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  •  一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  •  隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环 境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

四大特性中,redo log解决了持久性(Durability)问题,undo log解决了原子性(Atomicity),MVCC和锁解决了幻读问题,最终一起实现了终极目标——解决了一致性(Consistency)问题。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐