MySQL(七):MySQL的事务(2)

链事务

链事务可以视为保存点模式的一个变种,带有保存点的扁平事务,如果当系统发生崩溃时,所有的保存点都会消失,因为其保存点是易失的,而非持久的,这意味着想要恢复保存点(SAVE POINT())时,要事务走到这步才会生效,所以就要事务从头开始重新执行,而不能直接从下一个最近的保存点开始执行(因为保存点都失效了)

链事务的思想是:将一个大事务分成几个小事务,当一个小事务执行完后,将释放不需要的数据对象,将必要处理的上下文传递给下一个要开始的小事务,注意,这里拆分出的所有小事务都要整体视为一个原子,也就是要保持原子性,必须要上一个小事务完成才可以执行下一个小事务,也就意味着下一个小事务要看到上一个小事务的结果,相当于全部小事务在一个事务中执行。

链事务与带有保存点的扁平事务不同的是,带有保存点的扁平事务能回滚到任意正确的保存点,而链事务中的回滚仅限于当前事务,即不能回滚到之前执行完的事务,也就是只能恢复到最近一个保存点,对于锁的原理(实现隔离性),两者也不相同。链事务在COMMIT后即释放了当前事务所持有的锁,即每个小事务完成后也会进行释放锁,也就是前面所说的释放掉不用的资源,而带有保存点的扁平事务不会影响至今为止所持有的锁(不会释放资源)。

嵌套事务

嵌套事务是一个层次结构框架(有点像封装对象一样),有一个顶层事务控制着各个层次的事务,顶层事务之下嵌套的事务被称为子事务,其控制着每一个局部的变换。

在这里插入图片描述

下面给出Moss对嵌套事务的定义:

  • 嵌套事务可以看成是由若干事务组成的一棵树,子树可以是嵌套事务也可以是扁平事务

  • 处在叶子结点的是扁平事务,内部结点是嵌套事务,但是每个叶结点到根的距离可以是可以不同的,也就可以不是平衡树

  • 位于根节点的事务称为顶层事务,其他事务称为子事务,子事务的前驱是父事务,父事务的下一层为儿子事务

  • 子事务既可以提交也可以进行回滚,但是它的提交并不会立马生效,除非由其父事务进行提交(注意这里父事务也是上一层的子事务,归根到底要顶层事务进行提交才可以提交),因此可以推论出,任何子事务都在顶层事务提交后才能真正提交

  • 树中的任意一个事务的回滚会引起它的所有子事务一同进行回滚。故子事务只有A、C、I特性,不具有D特性,也就是有自己的原子性,一致性,隔离性,但并不能持久,因为会被父事务影响。

分布式事务

分布式事务通常是一个在分布式环境下运行的扁平事务,因此需要根据数据所在位置访问网络中的不同节点。

假设一个用户在ATM机前进行银行的转账操作,要从招商银行的储蓄卡转账10000元到工商银行的储蓄卡(整个转账相当于一个事务)。在这种情况下,可以将ATM机视为节点A,然后招商银行的后台数据库视为节点B,还有工商银行的后台数据库视为节点C,整个业务可以视为以下几个步骤

  1. 节点A发出转账命令

  2. 节点B执行从储蓄卡中将余额值减去10000

  3. 节点C执行从储蓄卡中将余额值增加10000

  4. 节点A通知用户操作完成或者失败

要完成这个事务就要使用分布式事务,因为分成了多个节点,不能只通过调用一个数据库就完成事务,这个过程需要访问网络中多个节点的数据库,而在每个数据库中执行的实务操作又都是扁平的。

对于分布式事务,同样需要满足ACID特性,要么都发生,要么都失效,对于上述栗子,2、3步骤任何一个失败都会发生严重的事情,所以一旦出现失误都要进行回滚,若不是这样,后果会很严重的。

对于MySQL数据库(InnoDB存储引擎)来说,其支持扁平事务、带有保存点的扁平事务、链事务、分布式事务。对于嵌套事务,MySQL数据库并不是原生的,因此对于有并行事务需求的用户来说MySQL是有点无能为力。

事务控制语句

在MySQL命令行的默认设置下,事务都是自动提交的(auto commit),即执行完事务里面的SQL后就会马上执行COMMIT操作,因此要显示地开启(即自己主动开启)一个事务必须使用命令BEGIN和START TRANSACTION,或者执行命令SET AUTOCOMMIT = 0,以禁用当前会话的自动提交。

下面介绍一些事务控制语句

START TRANSACTION 或者 BEGIN //显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值