InnoDB-事务

概述

分类

从事务理论的角度来说,可以把事务分为以下几种类型:

  • 扁平事务
  • 带有保存点的扁平事务
  • 链事务
  • 嵌套事务
  • 分布式事务

扁平事务

是事务类型中最简单的一种,也是实际生产环境中使用最频繁的事务
在扁平事务中,所有操作都处于同一层次,由BEGIN WORK开始,由COMMIT WORK或ROLLBACK WORK结束,其间的操作是原字的,要么都执行,要么都回滚,因此扁平事务是应用程序成为原子操作的基本组成模块

扁平事务的主要限制是不能提交或回滚事务的某一部分,或分几个步骤提交.

带有保存点的扁平事务

除了支持扁平事务支持的操作外,允许在事务执行过程中回滚到同一事务中较早的一个状态,这是因为某些事务可能在执行过程中会先的错误并不会导致所有的操作都无效,放弃整个事务不合乎要求,开销也太大,保存点用来通知系统应该记住事务当前的状态,以便当发生错误时,事务能回到保存点当时的状态

链事务

可视为保存点模式的一种变种.带有保存点的扁平事务在系统崩溃时所有保存点都将小时,因为其保存点是易失的,而非持久的.

链事务的思想是:在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务.链事务中提交事务操作和开始下一个事务操作将合并为一个原子操作.这意味着下一个事务能看到上一个事务的结果,就好像在一个事务中进行的.

链事务与带保存点的扁平事务不同的是带有保存点的扁平事务能回滚到任意正确的保存点,而链事务中的回滚仅限于当前事务,即只能恢复到最近一个的保存点.对于锁的处理,两者也不相同,链事务在执行COMMIT后释放了当前事务所持有的锁,而带有保存点的扁平事务不影响迄今为止所持有的锁

嵌套事务

是一个层次结构框架,由一个顶层事务控制各个层次的事务.顶层事务之下嵌套的事务被称为子事务,其控制每一个局部的变换.

  • 嵌套事务是由若干事务组成的一棵树,子树既可以是嵌套事务,也可以是扁平事务
  • 处在叶子节点的事务是扁平事务
  • 处于根节点的事务成为顶层事务,其他事务成为子事务
  • 子事务既可以提交也可以回滚,但它的操作并不是马上生效,除非其父事务已提交
  • 树中任意一个事务的回滚会引起它所有子事务一起回滚

实际的工作是交由叶子节点来完成的,即只有叶子节点的事务才能访问数据库,发送信息,获取其他类型的资源,而高层的事务仅负责逻辑控制,决定何时调用相关的子事务

分布式事务

通常是一个在分布式环境下运行的扁平事务

事务的实现

事务隔离性由锁来实现,原子性,一致性,持久性通过数据库的redo log和undo log来完成.redo log称为重做日志,用来保证事务的原子性和持久性,undo log用来保证事务的一致性

redo

重做日志用来实现事务的持久性,其由两部分组成:一是内存中的重做日志缓冲,是易失的,而是重做日志文件,是持久的

InnoDB是事务的存储引擎,其通过Force Log at Commit机制实现事务的持久性,即当事务提交时,必须先将事务的所有日志写入到重做日志文件进行持久化,待事务的COMMIT操作完成才算完成

重做日志在InnoDB中有两部分组成,即redo log和undo log.redo log用来保证事务的持久性,undo log用来帮助事务回滚及MVCC的功能.redo log基本上都是顺序写的,在数据库运行时不需要对redo log的文件进行读取操作.而undo log是需要进行随机读写的