事务的分类
- 扁平事务(最常见)
- 带有保存点的扁平事务
- 链事务
- 嵌套事务
- 分布式事务
事务的实现
redo
基本概念
- 用来保证事务的原子性和持久性,通常记录的是页的物理修改操作,是物理日志
- 当用来实现事务的持久性时,由两部分组成:
- 内存中的redo log buffer(易失的) ;redo log file(持久的)
- 基本上是顺序写的
- 存放在重做日志文件中
LSN
- 表示事务写入重做日志的字节的总量,其单位是字节,占用8个字节
- 见p303
- 不仅记录再重做日志中,还存在于每个页中,LSN表示该页最后刷新时LSN的大小
- 用来控制重做日志刷新到磁盘的策略,0,1,2。其中默认是1,表示事务提交时必须调用一次fsync操作。其他的两种见p295
undo
- 用来保证事务的一致性,根据每行记录进行记录
- 需要进行随机读写,用来帮助事务回滚及MVCC的功能
- 由purge线程判断是否删除undo log及undo log所在页
- undo log的格式:
- insert undo log:指在insert操作中产生的undo log,因为insert操作的记录,只对事务本身可见,对其他事务不可见(这是事务隔离性的要求),因此undo log可以在事务提交后直接删除,不需要进行purge操作。
- update undo log:记录的是对delete和update操作产生的undo log。该undo log可能需要提供MVCC机制,因此不能在事务提交时就进行删除
binlog
- 用来进行POINT-IN-TIME的恢复以及主从复制环境的建立
- 是再Mysql数据库的上层产生的,是一种逻辑日志,记录的是对应的SQL语句,只在事务提交完成后进行一次写入
- 存放在数据库内部的一个特殊段中,即undo 段,位于共享表空间内
group commit
- 在mysql5.6之前,group commit和binlog的多repulication存在冲突 ,基本上有副本的都没有做到group commit,是由于prepare_commit_mutex锁
- mysql 5.6 使用 Binary Log Group Commit的方式,在Mysql数据库上层进行提交时首先按顺序将其放入一个队列中,队列中的第一个事务称为leader,其他事务称为follower,leader控制着follower的行为。一共有三个阶段,分别是flush阶段、sync阶段、Commit阶段
- 见p322
事务控制语句
- 在存储过程中,只能使用START TRANSACTION语句来开启一个事务
- 见p323
对于事务操作的统计
- 计算TPS的方法是:(com_commit + com_rollback) /time 【利用这种方法进行计算的前提:所有的事务都是显式提交的,不会计算隐式的,即不会计算autocommit】
- SHOW GLOBAL STATUS LIKE ‘com_commit’;
事务的隔离级别
- 打算把锁部分看完 在看这个 ~