目录
一、事务的使用场景(目的)
事务会把数据库从一种一致状态转换为另一种一致状态,在数据库提交工作时,可以确保要么所有修改都已经保存了,要么所有的修改都不保存。(为了保证数据的完整性,需要使用事务)
二、事务的特性
ACID(mysql四个都符合,有的数据不完全符合)
A(atom,原子性):数据库的事务是不可分割的
C(consistency,一致性):在事务开始前和事务开始后,数据库的完整性约束没有被破坏。通俗来讲就是数据没有问题。
I(isolation,隔离性、并发控制、可串行化、锁):要求每个读写事务的对象对其他事务的操作对象能互相分离(提交前对其他事务都不可见)
D(durability,持久性):事务一旦提交,气结果就是永久性的
三、事务的类型
1、扁平事务
最简单,也是使用最频繁的一种,由begin开始,commit或者rollback结束,要不就全部执行,要不就全部结束
2、带保存点的扁平事务
和扁平事务类似,但是用save work来保留保存点,并且可以回滚到所有的保存点。有的事务不能全部回滚(比如订机票加订酒店)
3、链事务
扁平事务的变种,上一个事务完成会触发下一个事务,只能回滚当前事务,无法回滚到任意事务点。
4、套嵌事务(mysql的innodb不支持)
由一个顶层事务控制各个层次的事务,类似树,叶子节点必须是扁平事务。回滚会引起所有事务的回滚。
5、分布式事务
操作网络中不同节点,要不就全成功,要不就全失败
四、事务的实现
1、事务的各个特性的实现:
A(原子性):redo log
C(一致性):undo log
I(隔离性):锁
D(持久性):redo log
所以事务是由redo log、undo log、锁来实现事务。
2、重做日志文件(持久性):
由两部分组成,一部分是重做日志缓冲(内存中),二部分是重做日志文件,当所有的数据都写入重做日志文件后才算成功。
重做日志文件包含redo log和undo log,redo log保证事务的持久性,undo log保证事务的回滚。
3、保持原子性(重做日志块,redo log block)
当事务commit之后,mysql根据事务策略,选择是否fsync将数据写入磁盘,而重做日志文件是以512(一个磁盘扇区大小)写入重做日志文件,因此重做日志写入可以保证原子性。
重做日志头占用12字节,尾占用8字节,所以每个重做日志块可以存储492字节数据。
4、保持一致性(undo log)
undo存放在数据库的undo段中,undo段位于共享表空间内,用来将数据库逻辑地回复到原来的样子(数据库原有的数据结构可能因此发生变化)。同时undo log也会产生redo log。
undo log就是以回滚来保证数据库的一致性
5、隔离性
锁保证隔离性
6、事务提交步骤
1、flush,将每个事务的二进制日志写入内存
2、sync,将内存中的二进制日志刷新到磁盘,若队列中有多个事务,那么仅一次fsync就完成了二进制日志的写入(blgc)
3、commit