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 使用自动回滚

 

posted @ 2019-07-10 10:12  褐色键盘  阅读(186)  评论(0)    收藏  举报