ACID: 原子性、持久性
InoDB提供缓冲池,提高读写速度,但可能奔溃断电等导致来不及同步到数据库中,InoDB采用redolog日志来解决持久性(崩溃恢复),undolog日志来解决原子性(回滚操作)。
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会先写入到磁盘,以保证崩溃恢复。
假设有A、B两个数据,值分别为1,2.1. 事务开始2. 记录A=1到undo log3. 修改A=34. 记录A=3到 redo log5. 记录B=2到 undo log6. 修改B=47. 记录B=4到redo log8. 将redo log写入磁盘9. 事务提交
ACID: 隔离性
InoDB主要采用MVCC机制实现,MVCC (MultiVersion Concurrency Control) 叫做多版本并发控制。
- 主要实现思想是通过数据多版本来做到读写分离。从而实现不加锁读进而做到读写并行。
- undo log :undo log 中记录某行数据的多个版本的数据。
- read view :用来判断当前版本数据的可见性
ACID: 一致性
一致性是指同时达到原子性、持久性、隔离性。
隔离级别
Mysql默认采用“可重复读”级别,兼顾可靠性和并发性能。
- 可靠性性高的,并发性能低(比如 Serializable)
- 可靠性低的,并发性能高(比如 Read Uncommited)
READ UNCOMMITTED
事务中的修改即使还没提交,对其他事务是可见的。
优点:最大地并发处理
缺点:脏读、不可重复读、幻读。
READ COMMITTED
一个事务的所有修改在没有提交之前,对其他事务时不可见的。
InnoDB采用MVCC机制,通过多版本控制,实现读写分离机制。
优点:读写并行
缺点:不可重读以及幻读问题
REPEATABLE READ(Mysql默认)
在一个事务内的多次读取的结果是一样的,即不存在脏读和不可重复读。
读写锁实现
- 优点:实现起来简单
- 缺点:无法做到读写并行
InoDB MVCC实现
读不加锁,且每次读到MVCC的一个相同版本。
- 优点:读写并行
- 缺点:实现的复杂度高。 存在幻读问题。
SERIALIZABLE
除了不会造成数据不一致问题,没其他优点。
