innodb事务-持久性
从mysql5.5开始,将默认的存储引擎修改为innodb,因为innodb事务的特性,能运用各种大量的场景,并且性能比较好。
事务的4个特性是ACID,即
- A 原子性
- C 一致性
- I 隔离性
- D 持久性
我们这里主要来看持久性。
我们都知道软件世界存在的量大耗时操作,一个是文件I/O,一个是网络I/O。
而innodb在持久性方面就是为了解决I/O问题。
解决问题
频繁的I/O操作是一个非常耗时的过程,这是相对于内存等操作而言,但是我们的各种数据都是存在于磁盘上,就无法避免和磁盘进行交互操作。innodb为了保证性能,选择了先将数据保持到内存,然后再保持到磁盘。
但是要实现先保存到内存,再存到磁盘,这个过程增加了一个环节,那么就会衍生出各种问题,最明显的问题就是如果数据存到内存中,这个时候机器宕机了,没有写到磁盘上,怎么办?
innodb为了最大化的保证数据不丢失,采用了Write-Ahead-Log的思路,即Redo Log。
事务持久性的实现
关键说明
Page
操作系统一个默认Page是4KB,而mysql的一个Page默认是16KB。
Redo Log
在innodb中Redo Log文件设置的默认值是48M,当然,这个值可以根据实际情况进行调优修改。
而一个Redo Log Block是512字节,因为早期的磁盘一个扇区就是512字节。
只要当Page数据一但写入到磁盘中,Redo Log其实就没有什么用了,所以Redo Log不是无限增长的,而是固定大小,循环重复使用,所以这就是为啥默认设定为48M的原因。
参考资料
- 《软件架构设计:大型网站技术架构和融合之道》
- MySQL innodb_page_size
- mysql的两阶段提交原理