ACID: 原子性、持久性

InoDB提供缓冲池,提高读写速度,但可能奔溃断电等导致来不及同步到数据库中,InoDB采用redolog日志来解决持久性(崩溃恢复),undolog日志来解决原子性(回滚操作)。
image.png

redo log 的同步是很快的,相当于预提交操作(总是优先于commit),当从奔溃重启后,可以检查redo log file 和 data的差异,如果两者相同则就当啥事也没发生,如果redo log file比data多一些记录,那么就从redo log file写入差异部分到data中。

既然redo log也需要存储,也涉及磁盘IO为啥还用它?

  • redo log 的存储是顺序存储,而缓存同步是随机操作。
  • 缓存同步是以数据页为单位的,每次传输的数据大小大于redo log。

总结
对于每一次修改:

  • undo log记录修改前的值,且undo log是逻辑日志,做数据库逻辑上的回滚操作。
  • redo log 记录修改后的值,且redo log是物理日志,做持久化的崩溃恢复。

在commit之前,redo log会先写入到磁盘,以保证崩溃恢复。

  1. 假设有AB两个数据,值分别为1,2.
  2. 1. 事务开始
  3. 2. 记录A=1undo log
  4. 3. 修改A=3
  5. 4. 记录A=3 redo log
  6. 5. 记录B=2 undo log
  7. 6. 修改B=4
  8. 7. 记录B=4redo log
  9. 8. redo log写入磁盘
  10. 9. 事务提交

ACID: 隔离性

InoDB主要采用MVCC机制实现,MVCC (MultiVersion Concurrency Control) 叫做多版本并发控制。

  • 主要实现思想是通过数据多版本来做到读写分离。从而实现不加锁读进而做到读写并行。
  • undo log :undo log 中记录某行数据的多个版本的数据。
  • read view :用来判断当前版本数据的可见性

    ACID: 一致性

    一致性是指同时达到原子性、持久性、隔离性。

隔离级别

Mysql默认采用“可重复读”级别,兼顾可靠性和并发性能。

  • 可靠性性高的,并发性能低(比如 Serializable)
  • 可靠性低的,并发性能高(比如 Read Uncommited)

READ UNCOMMITTED

事务中的修改即使还没提交,对其他事务是可见的。
优点:最大地并发处理
缺点:脏读、不可重复读、幻读。

image.png

READ COMMITTED

一个事务的所有修改在没有提交之前,对其他事务时不可见的。
InnoDB采用MVCC机制,通过多版本控制,实现读写分离机制。
image.png
优点:读写并行
缺点:不可重读以及幻读问题

REPEATABLE READ(Mysql默认)

在一个事务内的多次读取的结果是一样的,即不存在脏读和不可重复读。

读写锁实现
image.png

  • 优点:实现起来简单
  • 缺点:无法做到读写并行

InoDB MVCC实现
image.png
读不加锁,且每次读到MVCC的一个相同版本。

  • 优点:读写并行
  • 缺点:实现的复杂度高。 存在幻读问题。

SERIALIZABLE

除了不会造成数据不一致问题,没其他优点。
image.png