MySQL技术内幕:InnoDB存储引擎(第7章事务)
7.1认识事务
7.1.1概述(ACID)
事务会把数据库 从一种一致状态转换为另一种一致状态。
-
Atomicity原子性
指整个数据库事务是不可分割的工作单位。要么全部成功,要么全部失败。
-
Consistency一致性
指事务将数据库从一种状态转变为下一种一致的状态。(事务开始前和结束后,数据库的完整性约束没有被破坏)
-
Isolation隔离性
事务提交前对其他事务不可见。一般为加锁策略。
-
Durability持久性
事务一旦提交,其结果就是永久性的,即使宕机也能恢复数据,保证事务系统的高可靠性(high reliability),而不是高可用性(high availability)。
7.1.2分类
- 扁平事务
- 带保存点的扁平事务
- 链事务
- 嵌套事务
- 分布式事务
7.2事务的实现
原子性、一致性、持久性通过数据库的redo log和undo log来完成。
redo log保证事务的原子性和持久性
undo log保证事务的一致性
7.2.1redo
保证事务的持久性,顺序写,数据库运行时不需要读取redo log文件。
事务提交时,必须先将该事务所有日志(redo、undo)写入到重做日志文件进行持久化,待事务的commit操作完成才算完成。
-
重做日志内存缓存(redo log buffer)
-
重做日志文件(redo log file)
-
innodb_flush_log_at_trx_commit
默认1;
0.仅在master thread中写重做日志
1.每次事务提交都写重做日志(fsync),强制落盘
2.每次事务提交只写到系统缓冲区,等系统落盘 -
log block(日志块,512字节)
重做日志块大小和磁盘扇区大小一样,都是512字节,因此重做日志的写入可以保证原子性,不需要double write技术。
一个块可能记录多个事务。 -
log group(重做日志组)
多组互为镜像,mysql只支持一个组,一个组有多个日志文件。
两个文件轮流写入。
其中一个有redo log file header(2K)记录checkpoint信息,有两个checkpoint记录,防止丢失。-
刷盘规则
1.事务提交
2.log buffer有一半内存空间已被使用
3.log checkpoint时 -
-
-
格式
-
LSN(log sequence number)日志序列号,8字节,单增
1.重做日志写入总量
2.checkpoint位置
3.页的版本 -
恢复(图)
仅需恢复checkpoint开始的日志部分。重做日志是物理日志,恢复速度很快。
7.2.2undo
有一个history列表,根据事务提交的顺序将undo进行链接。
-
基本概念
位置:
存放在特殊端(segment)中,undo段,位于共享表空间。
作用:
1.是逻辑日志,将数据库逻辑的恢复到原来的样子(回滚)。
2.MVCC,通过undo读取之前的版本信息,实现非锁定读。
持久性:
undo也会产生redo log,需要持久性保护。
保证事务的一致性,帮助事务回滚及MVCC功能,需要进行随机读写。(rollback回滚)。 -
undo管理
1个rollback segment -》 1024个undo log segment -》 申请undo页。
参数:
innodb_undo_directory:文件所在路径(没有默认在共享表空间)
innodb_undo_logs:rollback segment个数,默认128
innodb_undo_tablespaces:设置构成rollback segment文件的数量,这样rollback segment可以较平均的分布在多个文件中。-
事务提交时触发undo操作
删除和重用:
1.将undo log放入列表中,以供之后的purge操作(事务提交后不能马上删除undo,因为可能还有其他事务在使用undo得到之前的版本,顾将其放到链表中,后续由purge判断删除)
2.判断undo log所在页是否可以重用(使用空间是否小于3/4),若可以分配给下一个事务使用
-
7.2.3purge
最终完成delete和update操作。
参数:innodb_purge_batch_size,不建议调整
-
清理顺序
先从history list中找undo,再从undo page中找undo log,避免大量随机去取操作,提高purge效率
7.2.4group commit(fsync)
批量将重做日志、二进制日志写入到文件中,提高性能。
- BLGC(二进制日志批量提交)
- GC(重做日志批量提交)
redo和undo的区别
保证:
redo log保证事务的原子性和持久性;
undo log保证事务的一致性
恢复:
redo恢复提交事务修改的页操作;undo回滚行记录到某个特定版本;
内容:
redo是物理日志,记录页的物理修改操作;
undo是逻辑日志,根据每行记录进行记录。
7.3事务控制语句
begin
start transaction
rollback
savepoint identifier
release savepoint identifier
set transaction
设置隔离级别:
read uncommit,read committed,repeatable read,serialiable
7.4隐式提交的SQL语句
DDL
各类alter,create,drop,rename,truncate等
用来隐式修改mysql架构操作
各类权限管理
管理语句
7.5对事务操作的统计
QPS(每秒请求数)
TPS(每秒事务处理能力)
计算公式:(com_commit+com_rollback)/time
7.6事务的隔离级别
查看隔离级别:
select @@global.tx_isolation;
read uncommit
read committed
repeatable read
serialiable
7.7分布式事务
XA事务来支持分布式事务
-
RMs
资源管理器(Resource Managers),提供访问事务资源的方法。通常就是一个数据库
-
TM
事务管理器(Transaction Manager),协调参与全局事务中的各个事务。需要和参与全局事务的所有资源管理器进行通信。
-
AP
应用程序(Application Program),定义事务的边界,指定全局事务的操作。
-
二阶段提交two-phase commit
- 准备prepare
- 提交commit或回滚rollback
-
模型图
7.8不好的事务习惯
7.8.1在循环中提交
在最后提交事务
7.8.2使用自动提交
设置为手动提交
7.8.3使用自动回滚
使用显示回滚
7.9长事务
将大事务拆分为大小合适的事务