一、分布式事务理论模型
分布式事务问题也叫分布式数据一致性问题,简单来说就是如何在分布式场景中保证多个节点数据的一致性。分布式事务产生的核心原因在于存储资源的分布性,比如多个数据库,或者MySQL和Redis两种不同存储设备的数据一致性等。在实际应用中,我们应该尽可能地从设计层面去避免分布式事务的问题,因为任何一种解决方案都会增加系统的复杂度。接下来我们了解一下分布式事务问题的常见解决方案。
1.1 X/Open分布式事务模型
X/Open DTP(X/Open Distributed Transaction Processing Reference Model)是X/Open这个组织义的一套分布式事务的标准这个标准提出了使用两阶段提交(2PC,Two-Phase-Commit)来保证分布式事的完整性。如图8-2所示,X/Open DTP中包含以下三种角色。
- AP:Application,表示应用程序
- RM:Resource Manager,表示资源管理器,比如数据库
- TM:Transaction Manager,表示事务管理器,一般指事务协调者,负责协调和管理事务,提供AP编程接口或管理RM。可以理解为Spring中提供的Transaction Manager。
图8-2所展示的角色和关系与本地事务的原理基本相同,唯一不同的在于,如果此时RM代表数据库,那么TM需要能够管理多个数据库的事务,大致实现步骤如下:
-
配置TM,把多个RM注册到TM,相当于TM注册RM作为数据源
-
AP从TM管理的RM中获取连接,如果RM是数据库则获取JDBC连接
-
AP向TM发起一个全局事务,生成全局事务ID(XID),XID会通知各个RM
-
AP通过第二步获得的连接直接操作RM完成数据操作。这时,AP在每次操作时会把XID传递给RM。
-
AP结束全局事务,TM会通知各个RM全局事务结束
-
根据各个RM的事务执行结果,执行提交或者回滚操作。
实际上这里会涉及全局事务的概念。也就是说,在原本的单机事务下,会存在跨库事务的可见性问题,导致无法实现多节点事务的全局可控。而TM就是一个全局事务管理器,它可以管理多个资源管理器的事务。TM最终会根据各个分支事务的执行结果进行提交或者回滚,如果注册的所有分支事务中任何一个节点事务执行失败,为了保证数据的一致性,TM会触发各个RM的事务回滚操作。
需要注意的是,TM和多个RM之间的事务控制,是基于XA协议(XA Specification)来完成的。XA协议是X/Open提出的分布式事务处理规范,也是分布式事务处理的工业标准,它定义了xa和ax系列的函数原型及功能描述、约束等。目前Oracle、MySQL、DB2都实现了XA接口,所以它们都可以作为RM。