知识卡片

XA全局事务的事务管理器与资源管理器分工

普通读书笔记卡

内容

当单个服务要同时操作多个数据源(如用户、仓库、商家分属不同数据库)时, 简单地对每个数据源依次调用commit()是危险的:如果最后一个数据源提交失败, 前面已经提交的数据源已无法回滚,会导致部分数据被提交、部分被撤销,一致性 彻底破坏。X/Open XA规范提出的解法是引入两个角色:全局的事务管理器 (Transaction Manager,负责协调全局事务)和局部的资源管理器(Resource Manager,负责驱动本地事务),两者间用标准化的双向接口通信。Java中对应的 实现是JTA(Java Transaction API)——TransactionManager接口给容器自动 管理事务用,UserTransaction接口给代码手动控制用,任何资源只要实现 XAResource接口就能接入JTA体系。这个”全局事务管理器统一协调、各数据源 只管本地事务”的分工模式,是理解后续[[两段式提交的两阶段流程与三大缺陷]] 的前提——协调者和参与者角色,正是从XA的事务管理器/资源管理器分工里派生 出来的。

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第3章"事务处理"3.2节 "全局事务"(源文件:_epub-src对应OEBPS/Text/chapter28.xhtml) - 结论依据:原文说明XA的核心是定义全局事务管理器和局部资源管理器之间 的通信接口,用于协调多个数据源的一致提交或回滚,并介绍JTA基于XA模式 在Java中实现的TransactionManager/UserTransaction/XAResource三个 接口,直接支撑本卡片结论。 - 原始内容:其核心内容是定义了全局的事务管理器(Transaction Manager, 用于协调全局事务)和局部的资源管理器(Resource Manager,用于驱动本地 事务)之间的通信接口。XA接口是双向的,能在一个事务管理器和多个资源 管理器之间形成通信桥梁,通过协调多个数据源的一致动作,实现全局事务 的统一提交或者统一回滚。