1. 事务概述
2. 事务分类
扁平事务
- 全部事务处于同一层次。其操做都是原子性,要不所有成功,要不所有失败。
带有保存点的扁平事务
- 除了支持扁平事务支持的操做外,为事务几个过程设置保存点,容许回滚到事务中较早的某个节点。
- 对于扁平事务来讲,其隐式设置了一个起始保存点。所以只能回滚到事务开始时的状态。
- 保存点用SAVE WORK函数创建,保存点在事务内部是递增的,根据应用逻辑选择回到哪一个保存点。
链事务
- 保存点是非持久化都,当系统崩溃时,全部保存点都将消失,当进行恢复时,事务须要从新开始执行。
- 链事务思想:T1事务提交时,把必要处理都上下文隐式传给T2事务,以此类推。这意味着下一个事务能看到上一个事务的执行结果。
- 链事务只能保证回滚到最近的一个保存点。
嵌套事务
- 由若干事务组成一颗事务树,子树能够是嵌套事务也能够是扁平事务。
- 处于根节点的是顶层事务, 一个顶层事务控制着各个层次的子事务。
- 处在叶子节点的是扁平事务,每一个子事务的从根到叶子节点的距离能够不一样。
- 子事务能够commit或rollback,可是commit并不是当即生效,除非父事务已经commit,故任何子事务都在顶层事务提交完毕后才真正提交。
- 树的任意一个事务回滚会致使它全部的子事务一块儿回滚。故子事务仅保留ACI特性,不具有D特性。
- 在Moss理论中,只有叶子节点的事务才能完成访问数据库,发送消息等操做。高层事务仅负责逻辑调度控制,决定什么时候调用相关等子业务。
分布式事务
3. 事务实现
概述:事务的隔离行是由锁来实现的。原子性,一致性和持久性是经过redo log和undo log实现的。redo log称为重作日志。用来保证事务的原子性和持久性。undo log用来保证事务的一致性。redo是物理日志,记录的是页的物理修改。undo是逻辑日志,根据每行记录进行记录,能够回滚行记录到某个版本。
3.1 redo
-
概述函数
- 重作日志用来实现事务的持久性,由两部分组成,一个是内存中的重作日志缓冲(redo log buffer),另外一个是重作日志文件(redo log file)这是持久性的。redo log基本上都是顺序写的,数据库运行时不须要进行读取操做。
-
与binlog比较性能
-
产生层面线程
- binlog产生于mysql数据库上层,不针对innodb引擎。
- redolog产生于innodb引擎层,是innodb特有的日志。
-
内容形式日志
- binlog是一种逻辑日志,记录的的是对应的sql语句。
- redolog是物理格式的日志,记录的是对每一个页的修改。
-
sync时间点code
- binlog只在事务commit完成后写入一次。
- redolog在事务进行中不断被写入。
-
log block
- 概述:innodb中,redolog都是以512字节进行存储的。这意味着redo log buffer和redo log file都是以块(block)进行存储的。因为重作日志块大小和磁盘山区都是512字节,因此写入都是原子性的,不须要double write技术。
-
LSN
- 概述:LSN(Log Sequence Number)表明的是日志序列号。在innodb引擎中LSN占8个字节,而且单调递增。
-
含义:
-
重作日志的写入总量,单位为字节
- 例如LSN数值为1000,T1写入100字节,则变为1100,T2写入200字节则变为1300,以此类推,表明着redolog的写入总量。
-
checkpoint的位置
- 经过单调增的LSN做为版本号来判断checkpoint点。
-
页的版本
- LSN不只存在于redolog中,也存在于每一个页的头部,页头部的FIL_PAGE_LSN值记录了该页的LSN,在页中LSN表示该页最后刷新时的LSN大小。能够经过LSN判断页是否须要进行恢复操做。
-
恢复
- 概述:innodb引擎不管上次数据库是否正常关闭,都是尝试进行恢复,因为checkpoint已经刷新到磁盘页上到LSN,所以恢复过程当中,只须要恢复checkpoint开始到日志部分。
3.2 undo
-
做用:
- undo为事务回滚提供支持,存放于数据库内部的一个特殊段(segment)内,这个段称为undo段,位于表共享空间内。undo是逻辑日志,所以只是将数据逻辑的恢复到原来到样子,全部修改都被逻辑地取消了。例如对于每个insert,innodb引擎会完成一个delete,对于每一个update也有相反的update。
- undolog为mvcc做数据支持,当用户读到一行被事务占用的记录时,能够经过undolog实现非锁定读取。
- undolog也会产生redolog,undolog也须要持久性保护。
-
undo 存储管理
- innodb引擎有rollback segment,每一个回滚段记录了1024个undolog segment,undo页在undolog segment里申请。
- 事务提交时,将undo log放入列表中,以供purge操做。同时判断undo log的页是否能够重用,若是能够分配给下个事务使用。
- 事务提交后并不会立刻删除undo log及所在的页,由于其余事务可能须要经过undo log页拿到行记录以前的版本,是否能够删除须要purge线程来判断。
- 若为每个事务都分配一个undo页,空间浪费严重,故undo页是能够重用的,有可能出现一个undo页里存储不一样事务的undo log,故purge操做须要涉及磁盘的离散读,是一个缓慢的过程。
-
undo log 格式
-
insert undo log格式
- insert undo log记录的是全部插入数据,由于insert操做的记录只对本事务可见,故在事务commit后不须要purge操做,直接删除。
-
update undo log格式
- update undo log记录的是delete和update操做的数据,该undolog可能须要提供对mvcc的支持,提交时放入undolog链表,等待purge线程删除。
3.3 purge
- purge用于完成delete和update中delete的最终操做。
3.4 group commit
-
概念
- 若事务为非只读事务,则每次事务提交都须要一次fsync操做,所以保证重作日志都写入磁盘。为了提升fsync性能,数据库提供了group commit功能,即一次刷新确保多个事务日志写入文件。
-
BLGC Binary Log Group Commit
- 开启binlog后,为了保证引擎层的事务和二进制文件的一致性,两者之间使用了二阶段事务。BLGC使用了一种leader-follower的方式,将事务提交氛围Flush,Sync,Commit三个过程。
4. XA事务
5. 事务控制语句
6. 事务隔离级别
7. 分布式事务