扁平事务
由begin开始,其中的操作是原子的,要么都执行,要么都回滚。
- 缺点:代价大,若中间某个条件不满足,需要全部回滚。
带有保存点的事务
如图所示,保存点是递增的。
链事务
保存点事务的一种变种,带有保存点的扁平事务,当系统发生崩溃时,所有的保存点都将消失,因此在进行恢复时,事务需要从开始处重新执行。
链事务:在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐士传递给下一个要开始的事务。
嵌套事务
如上图所示,嵌套事务是一个层次结构框架,由一个顶层事务控制各个层次的事务,类似一个树形结构。
分布式事务
分布式场景下运行扁平事务,需要根据数据所在位置访问网络中的不同节点。
事务的实现
- redo
- 基本概念:用来实现事务的持久性,由两部分组成:内存中的重做日志缓冲(易失性)和重做日志文件(持久性)。每次事务提交之后,需要将所有日志写入重做日志文件中进行持久化,并且写完要调用fsync操作进行磁盘同步。
- 存储方式:以512字节的块进行保存(也成为重做日志块),日志块有头12字节,尾8字节的标志位。
- 注:redo记录的是物理页上的变化。
- undo
- 基本概念:undo存放在数据库内部的一个特殊段中,成为undo段,undo段位于共享表空间中。当存储引擎回滚时,做的是与之前相反的工作,insert对应delete,update对应相反的update。
- 存储方式:使用段的方式,每个回滚段中记录1024个undo log 段。
- 注:undo记录的是逻辑结构上的变化。undo log的产生也会造成redo log的产生,因为undo log需要持久性的保护。
- purge
delete和update可能并不直接删除原有数据,InnoDB存储引擎支持MVCC,所以记录不能再事务提交时立即进行处理,可能其他事务正在引用这行。是否可以删除某条记录可以通过purge来进行判断。
这个连接文章写的非常好,讲了四种隔离级别和并发控制。