在讲解Seate中的XA模式之前我们先来了解了解什么是XA规范。XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范描述了全局的TM与局部的RM之间的接口,XA 规范 在上世纪 90 年代初就被提出。目前,几乎所有主流的数据库都对 XA 规范 提供了支持。
XA 规范使用两阶段提交(2PC,Two-Phase Commit)来保证所有资源同时提交或回滚任何特定的事务。
它不是一个网络协议而是定义了 事务管理器(Transaction Manager)、应用程序(Application Program) 和 资源管理器(Resource Manager) 之间交互的 CAPI(Common Application Programming Interface) 接口标准
DTP(Distributed Transaction Processing)模型定义如下角色:
DTP模式定义TM和RM之间通讯的接口规范叫XA,简单理解为数据库提供的2PC接口协议,基于数据库的XA协议来实现的2PC又称为XA方案。
俩阶段分为 准备阶段 和 提交阶段,它对分布式事务管理的流程如下
案例解释:
应用程序(AP)持有商品库和余额库两个数据源。
编辑 应用程序(AP)通过TM通知余额库(RM)和商品库(RM),来创建订单和减余额,RM此时未提交事务,此时商品和余额资源锁定。
如果TM收到执行回复,只要有一方失败则分别向其他RM发送回滚事务,回滚完毕,资源锁释放。
如果TM收到执行回复,全部成功,此时向所有的RM发起提交事务,提交完毕,资源锁释放。
我们都知道在Seata中有三个核心角色:事务管理器(Transaction Manager)、资源管理器(Resource Manager) 和 事务协调者(Transaction Coordinator)。
但是,在Seata中三个角色的定义与XA协议标准中角色的定义有所区别:
事务管理器(Transaction Manager)应该对应XA协议中的应用程序(Application Program)
事务协调者(Transaction Coordinator)对应XA协议中的事务管理器(Transaction Manager)
在Seata对原始的XA模式做了简单的封装和改造,以适应自己的事务模型,基本架构如图:
RM一阶段的工作:
① 注册分支事务到TC
② 执行分支业务但不提交
③ 报告执行状态到TC
TC二阶段的工作:
RM二阶段的工作:
修改application.yml文件(每个参与事务的微服务),开启XA模式:
seata:
data-source-proxy-mode: XA
给发起全局事务的入口方法添加@GlobalTransactional注解:
@GlobalTransactional
@Transactional(rollbackFor = Exception.class)
public void saveOrder(OrderSaveParam orderSaveParam) {
// 参数校验等必要操作
// ...
// 修改库存
reduceGoodsCount(goodsCountMap);
// 扣除余额
reduceMoney(id,money);
// 异常回滚事务
int i = 1 / 0;
}
性能:低 模式:CP,强一致性 难易程度:简单,基于数据库自带特性实现,无需改表 应用场景:金融行业,并发量不大,但数据很重要的项目
优点:
缺点:
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。