前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式事务

分布式事务

作者头像
关忆北.
发布2022-05-05 15:05:31
6110
发布2022-05-05 15:05:31
举报
文章被收录于专栏:关忆北.关忆北.关忆北.
image-20220214171941159
image-20220214171941159
  1. A模块Mapper直接操作DB得到数据集
  2. 使用Feign调用B模块
  3. B模块Mapper操作DB得到数据集
  4. 合并1,3两步操作或者其他操作

可举例:购物,走DB,库存-1,买家扣钱。 1:库存 2:查询到还有库存,下单,调用支付API扣钱 3:银行卡扣钱 4:判断1、3的结果

分析以上步骤可能抛出异常的情景:

步骤1发生异常,Spring事务回滚

步骤2发生异常,Spring事务回滚

步骤3发生异常,3的服务实现自动回滚,2根据3的返回值来决定是否回滚

步骤四出险异常,1自动回滚,3的操作不会回滚,导致双方数据不同步。不符合同时成功、同时失败原则。

由于Spring的事务是基于单体的,所以Spring的事务并不适用于该情况。解决方法有LCN分布式事务框架和Seata分布式事务框架。

分布式事务原理

TCC(Try-Confirm-Cancel)

  • Try阶段:尝试运行,完成所有业务检查(一致性),预留业务必须的资源。
  • Confirm阶段:确认需要真正执行的业务,该阶段需要具备幂等设计,Confirm失败后需要进行重试。
  • Cancel阶段:取消执行,释放Try阶段预留的业务资源。Cancel阶段的异常和Confirm阶段异常处理方案基本上一致,要求满足幂等设计。
image-20220215094939440
image-20220215094939440
解决方案

在企业级微服务解决方案中,我们可以使用LCN或Seata负责监控每个服务的事务。

以LCN为例:

服务发起方:Feign调用其他服务

@TxTransaction(isStart = true)
@Transactional(rollbackFor = Exception.class)
public void save(){
	//do something
}

服务被调用方

@TxTransaction
@Transactional(rollbackFor = Exception.class)
public void save() {
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分布式事务原理
  • 解决方案
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档