一、背景

  1. 单库事务

image.png

MySQL的innodb存储引擎轻松实现;

  1. 跨库事务

image.png

问题:如何去实现ServiceA的事务;

二、事务理论

1、事务特征

ACID特性
原子性(Atomicity)

  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

    2、分布式系统理论

    a、CAP

    (Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性))
    image.png
    在CAP理论中,分布式系统不能够同时兼顾CAP,因此就有一下的三种组合模式;

  • CA:放弃分区容错性,加强一致性和可用性,比如传统的单机数据库

  • AP:放弃一致性(强一致性),追求分区容错性和可用性,比如很多NoSQL系统
  • CP:放弃可用性,追求一致性和分区容错性,基本不会选择,如果出现网络问题会直接让整个系统不可用

    b、base理论

    (Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent (最终一致性) —柔性事务)

image.png

BASE理论实现保证

  • 可见性;全局唯一标识,落地事务信息。
  • 幂等;子事务幂等性保证

c、X/Open DTP——分布式事务模型

X/Open DTP(X/Open Distributed Transaction Processing Reference Model) 是X/Open 这个组织定义的一套分布式事务的标准,也就是了定义了规范和API接口,由这个厂商进行具体的实现。这个思想在java 平台里面到处都是。

X/Open DTP 定义了三个组件: AP,TM,RM

  • AP(Application Program):也就是应用程序,可以理解为使用DTP的程序
  • RM(Resource Manager):资源管理器,这里可以理解为一个DBMS系统,或者消息服务器管理系统,应用程序通过资源管理器对资源进行控制。资源必须实现XA定义的接口
  • TM(Transaction Manager):事务管理器,负责协调和管理事务,提供给AP应用程序编程接口以及管理资源管理器

其中,AP 可以和TM 以及 RM 通信,TM 和 RM 互相之间可以通信,DTP模型里面定义了XA接口,TM 和 RM 通过XA接口进行双向通信,例如:TM通知RM提交事务或者回滚事务,RM把提交结果通知给TM。AP和RM之间则通过RM提供的Native API 进行资源控制,这个没有进行约API和规范,各个厂商自己实现自己的资源控制,比如Oracle自己的数据库驱动程序。

具体交互如下图所示:
image.png

三、实现方案

1、XA协议两阶段提交

image.png
image.png

2、TCC

Try-Confirm-Cancel
image.png

  1. 主业务服务首先开启本地事务
  2. 向业务活动管理器申请启动分布式事务主业务活动
  3. 主业务服务注册从业务活动,然后调用从业务服务的 Try 接口
  4. Try 接口调用成功,主业务服务提交本地事务;若调用失败,主业务服务回滚本地事务;
  5. 主业务服务提交本地事务,则 TCC 模型分别调用所有从业务服务的 Confirm 接口;若主业务服务回滚本地事务,则分别调用 Cancel 接口
  6. 所有从业务服务的 Confirm 或 Cancel 操作完成后,全局事务结束

TCC最终也只能够做到脏读的隔离级别

3、SAGA

补偿型事务
image.png

SAGA和TCC及其相似,只是省略了传统意义上的try模块,减少对业务的入侵。

4、最大补偿性

image.png
•主动方,在完成业务活动处理后,向业务活动被动方发送消息,允许消息丢失

•被动方根据定时策略,向业务活动的主动方查询,恢复丢失的业务消息

最大补偿型属于上游对下游的结果不关系,但是又需要保证数据正确性。或者下游的具体处理策略完全由上游决定,并且能够完美的完成上游的决定。

**