【20220503】mysql之事务

目录

一、事务的使用场景(目的)

二、事务的特性

三、事务的类型

        1、扁平事务

        2、带保存点的扁平事务

        3、链事务

        4、套嵌事务(mysql的innodb不支持)

        5、分布式事务

四、事务的实现

        1、事务的各个特性的实现:

        2、重做日志文件(持久性):

        3、保持原子性(重做日志块,redo log block)

        4、保持一致性(undo log)

        5、隔离性

        6、事务提交步骤


一、事务的使用场景(目的)

        事务会把数据库从一种一致状态转换为另一种一致状态,在数据库提交工作时,可以确保要么所有修改都已经保存了,要么所有的修改都不保存。(为了保证数据的完整性,需要使用事务)

二、事务的特性

        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

猜你喜欢

转载自blog.csdn.net/MrBlind/article/details/124580068