7.1 认识事务
概述
作用:
事务会把数据库从一种一致状态转化为另一种一致状态。这事务模型区分文件系统的重要特征之一。
事务必须同时满足ACID特性:
原子性 automicity 取款,要么都做要么都不做。
一致性 consistency 更改姓名,事务修改数据的前后没有破坏数据库的完整性约束。
隔离性 isolation 要求事务提交前对其他事务不可见,通常这使用锁来实现。 粒度锁策略:允许事务仅锁住一个实体对象的子集,以此来提高事务之间的并发度。
持久性 durability 指事务一旦提交,所有的变化都是永久的。即使发生宕机现象,也能将数据恢复。
分类
扁平事务 体现事务的原子性,要么都操作要么都回滚。不足:不能提交或者回滚事务的一部分,例如:从中国转机印度飞去意大利。
带有保存点的扁平事务 保存点:用来通知系统应该记住事务当前的状态,以便于发生错误时,事务能回到保存点当时的状态
链事务 解决当系统崩溃时,保存点易失、非持久的缺点。在提交一个事务时释放不需要的数据对象,将必要的处理上下文隐式的传给下一个事务。提交事务操作和开始下一个事务操作合并成一个原子操作。即,只能恢复到最近一个保存点。
嵌套事务 处于根节点的事务称为顶层事务,其他事务称为子事务。
分布式事务 在ATM机(节点A)进行跨行转账操作,B行转到 C行。
A发出转账命令—— B执行余额值减去999——c执行余额增加999——A通知用户操作成功/失败
7.2 事务的实现
redo
重做日志 用来实现事务的一致性。记录的是物理操作日志,每个事务对应多个日志条目,并且事务的重做日志写入是并发的,并非在事务提交时写入,是无序的。
重做日志块 log block 以块的形式进行缓冲,512字节。
重做日志组 log group 是一个逻辑概念,由多个重做日志文件组成。
重做日志恢复
undo
数据库利用 undo信息进行回滚。undo存放在共享表空间的undo段中。
undo是逻辑日志,只是将数据库逻辑恢复到原来的样子,所有修改都被逻辑取消。但是这不是页本身的回滚。举个例子,用户执行来一个插入操作,会使表空间变大,当=逻辑回滚时表空间大小不会缩小。InnoDB存储引擎回滚时,会完成一个delete操作,是表空间复原。
为什么需要逻辑回滚呢?因为在多用户并发系统中可能有数百数千个并发事务,不能影响其他事务正常工作。
MVCC 当用户读取一行记录时,若该记录被其他事务占用,用户可以通过undo读取之前的版本信息,以此实现非锁定读取。
注意:undo也会产生redo log。
undo存储管理
undo log格式
查看undo信息
purge
是否可以删除该条记录通过purge来判断: 所有删除/更新事务不能在事务提交时进行处理,这时其他事务可能在引用这一行。
group commit
fsync操作: 等待写磁盘操作结束后返回。
详情略。
7.3 事务控制语句
start transaction | gegin 显式的开启一个事务
commit rollback
7.4 隐式提交的SQL语句
7.5 对于事务操作的统计
每秒事务的处理能力 TPS
7.6 事务的隔离级别
read uncommitted. 出现脏读,读到另一个事务未提交的数据
read committed 出现不可重复读,一个事务内两次读取的数据不一致
repeatable read 幻读 ,第一次读发现没有,第二次又读到来。
serializable 最严格的隔离级别,所有事务按照次序依次执行。
7.7 分布式事务
指的是允许多个独立的事务资源参与到一个全局的事务中去。全局事务要求在其中的所有事务要么都提交要么都回滚。
银行转账。
MYSQL数据库分布式事务
内部XA事务
7.8 不好的事务习惯
在循环中提交
InnoDB在循环中会自动提交。
使用自动提交
作者认为,应用程序开发时最好把事务的控制权限交给开发人员,在程序端进行事务的开始或结束。
使用自动回滚
无法得知错误的原因
7.9 长事务
顾名思义:执行时间较长的事务。