MYSQL技术内幕-innoDB存储引擎 第七章 事务
认识事务
1 概述
innoDB默认事务隔离级别read repeatable
原子性
一致性
隔离性
持久性
2 分类
(1)扁平事务
最简单,最频繁,所有操作都处于同一层次
(2)带有保存点的扁平事务
允许在事务执行过程中回滚到同一事务中较早的一个状态。保存点用来通知系统记住事务当前的状态,以便发生错误时,回到保存点的状态
保存点用save work函数来建立,rollback work函数回滚
保存点在事务内部是递增的
(3)链事务
在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务。
(4)嵌套事务
一个顶层事务控制着各个层次的事务
(5)分布式事务
分布式环境中运行的扁平事务
innoDB存储引擎支持扁平事务,带有保存点的事务,链事务,分布式事务
事务的实现
redo log重做日志,用来保证事务的原子性和持久性。恢复提交事务修改的页操作,通常是物理日志,记录的是页的物理修改操作
undo log保证事务的一致性。回滚行记录到某个特定版本,逻辑日志,根据每行记录进行记录
1 redo
重做日志用来实现事务的持久性,由两部分组成:
(1)内存中的重做日志缓冲
(2)重做日志文件,持久的
通过force log at commit实现事务的持久性,事务提交时,必须将该事务的所有日志写入重做日志文件进行持久化,待事务的commit操作完成才算完成
重做日志缓存先写入文件系统缓存,再进行fsync操作,写入磁盘,因此磁盘性能决定事务提交的性能,也就是数据库的性能
innoDB允许用户手工设置非持久性的情况,以提高性能,但是宕机时会丢失最后一段时间的事务
和二进制日志binlog的区别:
(1)重做日志是innoDB存储引擎产生的,而二进制日志是mysql数据库的上层产生的,任何存储引擎对数据库的更改都会产生二进制日志
(2)二进制日志是一种逻辑日志,记录的是sql语句,重做日志是物理格式日志,记录的是每个页的修改
(3)二进制日志只在事务提交完成后一次写入,重做日志在事务进行中不断被写入
重做日志都是以512字节进行存储的,所以重做缓存,重做日志文件都是以块的方式进行保存,称为重做日志块,大小512字节
重做日志块大小和磁盘扇区大小一样,因此写入可以保证原子性
重做日志块还包括日志块头和日志块尾
long group 重做日志组,是一个逻辑概念,由多个重做日志文件组成,
LSN日志序列号,8字节,单调递增,包含:
(1)重做日志写入的总量
(2)checkpoint的位置
(3)页的版本
innoDB启动时不管上次关闭是否正常,都会进行恢复。重做日志记录的是物理日志,因此恢复速度快
因为checkpoint表示已经刷新到磁盘上的LSN,因此只需恢复checkpoint开始的日志部分
2 undo
事务的回滚操作,需要undo。在对数据库进行修改时,innoDB不但会产生redo,还会产生undo。
undo存放在数据库内部的一个特殊段中,这个段称为undo段,
undo回滚时,会做一个之前相反的工作,
undo另一个作用是mvcc,
undo log也会产生redo log,因为undo log也需要持久性的保护
innoDB对undo采用段的方式管理,rollback segment,每个回滚段记录了1024个undo log segment
1.1之前只有一个rollback segment,因此支持同时在线的事务限制为1024,
1.1之后有128个rollback segment,因此在线事务提高到128*1024
undo log分为:
(1)insert undo log
(2)update undo log
3 purge
delete和update并不直接删除原有数据,只是将记录的delete flag设置为1,因为innoDB支持mvcc,所以不能在事务提交时立即进行处理,
purge操作是清理之前的delete和update操作,
4 group commit
一次fsync可以刷新确保多个事务日志被写入文件
事务控制语句
事务隔离级别
1 read uncommitted
2 read committed
3 repeatable read
4 serializable
innoDB默认隔离级别repeatable read,使用next-key lock避免幻读
分布式事务
不好的事务习惯
1 在循环中提交
2 使用自动提交
3 使用自动回滚

浙公网安备 33010602011771号