mysqlmvvc

243 阅读2分钟

1. 什么是事务,什么是事务的隔离级别,隔离级别有多少种,它们的关系是什么?

  • 事务就是数据库最小的操作单元,它满足了ADIC的特性保证我们的数据能被正常的读取和写入,隔离级别就是四大特性中的隔离性的详细实现。一共有4种隔离级别。

2. 什么是当前读、什么是快照读。

  • ==当前读==就是加锁的读取,保证同一时间内同一个的数据只有一个事务可以访问,它可能对读读和读写的操作进行阻塞,从而保证读取的数据是最新的。
  • ==快照读==是在RC和RR级别下通过MVCC结合ReadView的一种保证多事务读写不阻塞的一种解决方案,提升了数据库的并发度。

3.RC和RR有什么区别?RC如何解决了脏读,又为什么会产生不可重复读?RR如何解决了不可重复读?

  • RC和RR在ReadView的生成机制上有差别(在锁的机制上也有差别,本文没有提到)。
  • RC通过ReadView的查询路径杜绝了脏读,保证不会读到未提交的事务,但是由于每次都会生成新的ReadView所以一个事务内重复读取会读到不一样的值。
  • RR只有在第一次查询会生成ReadView,后期再怎么查都是复用第一次的,所以解决了不可重复读。

4. 什么是幻读?RR到底有没有解决幻读?

  • 幻读主要针对的insert操作。
  • 查询一批数据,两次结果的值不一样,就是不可重复读。
  • 查询一批数据,两次结果数量不一样,这就叫幻读
  • RR只解决了快照读(只读事务)下的幻读,如果混合了当前读(查询后更新),就无法避免了,因为更新会读取当前最新的数据,并且会更新事务Id,导致ReadView也会重新生成。

5. MVCC是什么?版本链是什么?ReadView又是什么?

  • MVCC是多版本并发控制,在不加锁的情况下可以保证读取的数据不会因为的事务的操作干扰。
  • 版本链是Mysql为了保证原子性使用undolog提供的一套更新数据的模型,只要有数据更新就会生成版本链条,和隔离级别无关。
  • ReadView存放着活跃事务ID列表,定义了版本链的数据哪些可见,哪些不可见。