InnoDB系列:事务

扁平事务

由begin开始,其中的操作是原子的,要么都执行,要么都回滚。

  • 缺点:代价大,若中间某个条件不满足,需要全部回滚。

带有保存点的事务


如图所示,保存点是递增的。

链事务


保存点事务的一种变种,带有保存点的扁平事务,当系统发生崩溃时,所有的保存点都将消失,因此在进行恢复时,事务需要从开始处重新执行。
链事务:在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐士传递给下一个要开始的事务。

嵌套事务


如上图所示,嵌套事务是一个层次结构框架,由一个顶层事务控制各个层次的事务,类似一个树形结构。

分布式事务

分布式场景下运行扁平事务,需要根据数据所在位置访问网络中的不同节点。

事务的实现

  1. redo
  • 基本概念:用来实现事务的持久性,由两部分组成:内存中的重做日志缓冲(易失性)和重做日志文件(持久性)。每次事务提交之后,需要将所有日志写入重做日志文件中进行持久化,并且写完要调用fsync操作进行磁盘同步。
  • 存储方式:以512字节的块进行保存(也成为重做日志块),日志块有头12字节,尾8字节的标志位。
  • 注:redo记录的是物理页上的变化。
  1. undo
  • 基本概念:undo存放在数据库内部的一个特殊段中,成为undo段,undo段位于共享表空间中。当存储引擎回滚时,做的是与之前相反的工作,insert对应delete,update对应相反的update。
  • 存储方式:使用段的方式,每个回滚段中记录1024个undo log 段。
  • 注:undo记录的是逻辑结构上的变化。undo log的产生也会造成redo log的产生,因为undo log需要持久性的保护。
  1. purge

delete和update可能并不直接删除原有数据,InnoDB存储引擎支持MVCC,所以记录不能再事务提交时立即进行处理,可能其他事务正在引用这行。是否可以删除某条记录可以通过purge来进行判断。

这个连接文章写的非常好,讲了四种隔离级别和并发控制。