【学习笔记】MySQL技术内幕InnoDB存储引擎——第7章 事务
第7章 事务
A 原子性:事务要么全部成功,要么全部失败
C 一致性:各种正确性约束全部生效,保证完整性
I 隔离性:事务互不影响,与隔离级别有关
D 持久性:长久的保存于磁盘;永久性的,即使发生故障后也可以修复
7.1 认识事务
7.1.1 概述
持久性指的是可靠性,而不是可用性
7.1.2 分类
1>扁平事务
最简单,使用最频繁,所有操作全部成功/失败
2>带有保存点的扁平事务
可以通过保存点来回滚事务中的部分操作,可设置多个保存点,事务开始时有隐式保存点,回滚后不释放锁,可以回滚至任意一个保存点
3>链事务
一个事务提交后一个事务开始,事务中的提交与下个事务的开始具有原子性。
只能回滚当前的事务,并释放当前事务持有的锁。
3>嵌套事务
①可以使用带保存点的扁平事务来模拟嵌套事务
②只有叶子节点可以操作数据库(DML)
③当父节点回滚时,子节点提交了也会回滚(不具备D特性)
4>分布式事务
访问网络中的不同节点(不同实例上的数据库),可以满足事务
【InnoDB不支持嵌套事务】
7.2 事务的实现
隔离性:锁机制
一致性、原子性、持久性:redo、undo log
7.2.1 redo
1>当事务提交时写入磁盘,master现场每一秒写入磁盘。可通过配置,不严格的将redo log写入磁盘,提升性能,但不保证D特性(P295)
fsync操作(将文件缓存写入磁盘操作)决定了事务性能(数据库行性能)
2>log block
重做日志块大小为512字节和磁盘扇区大小一致
3>log group
事务提交时将log block刷新到磁盘
当log buffer 中有一半内存空间已被使用时将log block刷新到磁盘
当到达log check point时将log block刷新到磁盘
4>重做日志格式
①重做日志的类型
②表空间ID
③页偏移量
5>LSN(日志序列号)
①存在于重做日志与每个页中
②内容:1.重做日志写入总量 2.cheak point位置 3.页的版本
6>恢复
InnoDB启动时不论上次是否正常关闭,都会尝试恢复cheak point之后的数据
7.2.2 undo log
1>在回滚操作中,会用到undo log
在MVCC非锁定读中,会用到undo log
undo log是逻辑日志,在回滚时,对于Insert,执行delete,对于delete,执行insert,对于upodate,反向update
2>undo log的写入操作会生产redo log日志,因为undo log也需要持久化
事务提交后不会马上删除undo log,因为MVCC还会依赖历史版本的undo log
3>insert undo log 会在事务提交时删除,但delete与update不是
7.2.3 purge
在delete或者update时,有时会将该记录打上delete标记,而实际并未删除,在purge中会统一集中的真正删除数据以及undo log
###7.2.4 group commit
不太理解,目前认为是将多个写磁盘任务合并,多个和事务的log可以同时用fsyn刷入磁盘,事务越密集,效果越好
7.3 事务控制语句
略
7.4 隐式提交的SQL语句
不能回滚的语句:P328
7.5 对于事务操作的统计
1>每秒请求数(QPS)
2>每秒事务处理能力(TPS)
TPS = (com_commit + com_rollback) / time
【可以准确计算显式提交事务,但对于隐式提交则不够准确】
7.6 事务的隔离级别
InnoDB的可重复读由于使用了间隙锁加行锁,不会产生幻读的问题,但与真正的串行化还是大不相同的。
串行化就是不使用MVCC了,直接加S锁。不非锁定读了。
7.7 分布式事务
利用XA事务实现分布式事务,即使是不同的数据库系统,只要都实现了XA事务,即可实现分布式事务
1>组成:
①资源管理器:提供访问事务资源的方法,通常一个数据库就是一个资源管理器
②事务管理器:协调参与全局事务的各个事务
③应用程序:定义事务处理边界,指定全局事务中的操作
2>具体实现
每一个资源管理器会将处理结果上报事务管理器,若都可提交,则都提交
若一个事务无法提交,则事务管理器会通知全部资源管理器回滚
7.8 不好的事务习惯
1>在循环中提交
2>自动提交
3>自动回滚(MySQL的自动回滚无法知晓异常信息)
7.9 长事务
可将耗时很长的事务拆分为小事务处理,因为长事务的回滚时很难的