MySQL事务

2020-05-02  本文已影响0人  xiaolyuh

事务是访问并更新数据库中各种数据的最小单元,在事务的操作中,要么都修改成功,要么都修改失败。它的主要目的是:将数据库从一个一直状态转换成另一种一直状态。

事务的四个特性是:

事务隔离性由锁来实现,原子性、一致性和持久性是通过数据库的redo log和undolog来实现的。

事务的隔离级别:

事务的分类

从事务理论的角度来说,可以把事务分为以下几种类型:

  1. 扁平事务(Flat Transactions)
  2. 带有保存点的扁平事务(Flat Transactions with Savepoints)
  3. 链事务(Chained Transactions)
  4. 嵌套事务(Nested Transactions)
  5. 分布式事务(Distributed Transactions)

扁平事务(Flat Transactions)

扁平事务事务时最简单的一种事务,也是平时用得最多的一种,在扁平事务中,所有操作都处于同一层次,其由BEGIN WORK开始,由COMMIT WORKROLLBACK WORK结束,其间的操作是原子的,要么都执行,要么都回滚。

带有保存点的扁平事务(Flat Transactions with Savepoints)

除了支持扁平事务支持的操作外,允许在事务执行过程中回滚到同一事务中较早的一个状态。这是因为某些事务可能在执行过程中出现的错误并不会导致所有的操作都无效,放弃整个事务不合乎要求,开销也太大。

保存点(Savepoint)用来通知系统应该记住事务当前的状态,以便当之后发生错误时,事务能回到保存点当时的状态。其实扁平事务就是只有一个保存点的事务。

image.png

当发生回滚是只有执行一次ROLLBACK WORK:7命名表示回滚到保存点7的位置,如果还需要回滚需要继续执行ROLLBACK WORK:x命令(x表示保存点编号),带有保存点的扁平事务能回滚到任意正确的保存点

带保存点事务的保存点是非持久化的,所以当系统崩溃时保存点就会丢失,这时系统恢复时,事务需要从头开始,从新执行。为了解决这个问题提出了链事务。

链事务(Chained Transactions)

链事务是在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务。

image.png

链事务有个缺点就是当需要回滚事务的时候,只能恢复到最近的一个保存点。

嵌套事务(Nested Transactions)

嵌套事务是一个层次结构框架。由一个顶层事务(top-leveltransaction)控制着各个层次的事务。顶层事务之下嵌套的事务被称为子事务(subtransaction),其控制每一个局部的变换。

image.png

嵌套事务特性:

分布式事务(Distributed Transactions)

在分布式环境下运行的扁平事务,因此需要根据数据所在位置访问网络中的不同节点。分布式事务的常用解决方案有2pc(两段式提交)、3pc(三段式提交)、TCC(Try、Confirm、Cancel)和基于消息的最终一致性。

分布式事务的大致实现思想都是引入一个事务管理器(协调者)来管理参与者服务的事务,由事务管理器来统一调度参与服务的事务到底是提交还是回滚。

InnoDB实现了XA协议,使用了2pc(两段式提交)的方式来实现了分布式事务。

InnoDB存储引擎支持扁平事务、带有保存点的事务、链事务、分布式事务。不支持嵌套事务。

2pc(两段式提交)

原理

image.png

第一阶段是表决阶段,由事务管理者(协调者)来发发起事务,并询问所有参与者是否可以提交事务。
第二阶段是执行阶段,协调者收到所有参与者的反馈,根据反馈的结果决定所有参与者是commit还是rollback

优点

缺点

3pc(三段式提交)

三阶段提交,也叫三阶段提交协议,是二阶段提交(2PC)的改进版本,主要是在协调者和参与者之间都引入了超时机制;在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。

原理

image.png

第一阶段,由事务管理者(协调者)来发发起事务,并询问所有参与者是否可以提交事务,这一步非常快速,不会操作数据库。
第二阶段,协调者询问是否可以提交事务,并询问所有参与者是否可以提交事务,这一步才会真正操作数据库。
第三阶段,协调者收到所有参与者的反馈,根据反馈的结果决定所有参与者是commit还是rollback,如果超时还是没有收到反馈这时也提交事务。

优点

缺点

TCC(Try、Confirm、Cancel)

TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作,TCC本质上也是一个两阶段提交。它分为三个阶段:

image.png

优点

跟2PC比起来,实现以及流程相对简单了一些,但数据的一致性比2PC也要差一些

缺点

缺点还是比较明显的,在2,3步中都有可能失败。TCC属于应用层的一种补偿方式,所以需要程序员在实现的时候多写很多补偿的代码,在一些场景中,一些业务流程可能用TCC不太好定义及处理。

分布式事务框架Seata

https://github.com/seata/seata

https://mp.weixin.qq.com/s/Xh2jfZgD7Qallh_DAUbeVg

不好的事务习惯

上一篇下一篇

猜你喜欢

热点阅读