1、ACID特性
1.1 原子性(atomicity)
事务可以由非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成,原子性要求事务的操作中,要么都做,要么都不做,事务中的任何一条SQL语句执行失败,已经执行成功的SQL语句也必须撤销,数据库的状态应回到执行事务前的状态。原子性由undo日志来实现。
1.2 一致性(consistency)
事务的一致性指的是数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。一致性通常由undo日志来实现。
1.3 隔离性(isolation)
事务的隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,隔离性通常这使用锁来实现。
1.4 持久性(durability)
事务的持久性要求事务一旦提交,其结果就是永久性的,即使发生宕机等故障,数据库也能将数据恢复。持久性通常使用redo日志来实现。
2、redo日志
redo日志用来实现事务的持久性,其由两部分组成:一是内存中的重做日志缓冲(redo log buffer),其是易失性的;二是重做日志文件(redo log file),其是持久性的。每次事务提交时,必须先将该事务的所有日志写入到重做日志文件进行持久化,待事务的commit操作完成才算完成。每次将重做日志缓冲写入重做日志文件后,InnoDB引擎都需要调用一次fsync操作。因为重做日志缓冲写入重做日志文件时,是先写入文件系统缓存的,为了确保重做日志写入磁盘,必须进行一次fsync操作。
2.1 log block
重做日志都是以512B进行存储的,意味这重做日志缓冲和重做日志文件都是以block方式进行保存的,称为重做日志块(redo log block),如果一个页中产生的重做日志数量大于512B,那么需要分割为多个重做日志块进行存储。由于重做日志块和磁盘扇区大小一样,都是512字节,因此重做日志写入可以保证原子性,不需要doublewrite。
log block由三部分所构成,分别是 日志块头(log block header),日志块尾(log block tailer),日志本身。日志头占用12字节,日志尾占用8字节。故每个块实际存储日志的大小为492字节
2.2 LSN
LSN是log sequence number的缩写,其代表的是日志序列号,在InnoDB存储引擎中,LSB占用8字节,并且单调递增,LSN表示的含义有:
- 重做日志写入的总量
- checkpoint的位置
- 页的版本

最低0.47元/天 解锁文章
820

被折叠的 条评论
为什么被折叠?



