InnoDB(四):InnoDB事务的ACID特性和实现

1、ACID特性

2、redo日志

3、undo日志

4、事务的4种隔离级别


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的位置
  • 页的版本

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值