TCC分布式事务七种异常情况

大家好,我是小趴菜,上篇文章我们了解了下TCC的5种编程模型,也知道了在try,confirm,cancel三个阶段都应该做什么事,今天我们来学习下在整个TCC模型过程中可能会出现的几种异常情况

TCC标准编程模型

异常一:try阶段异常

在try阶段异常之后,就会执行cancel阶段,此时cancel阶段是一定要保证成功的,如果cancel阶段没有执行成功,那么就要进行重试

异常二:cancel阶段异常

其实这个异常的处理方式和异常一是一样的,失败了就重试,如果一直重试失败,那么就要进行人工干预

异常三:confirm提交异常

try阶段成功了,那么confirm一定要成功,如果失败了,那么就要进行重试,重试多次还未成功,那么就要进行人工干预

但是这里重试要注意,因为在confirm阶段有二步数据库操作,如果扣冻结张三20元成功了,但是李四加20元失败了,这时候重试就要做判断,看张三扣减20元是否之前已经操作成功了,如果操作成功了,就不要再次进行扣减冻结的操作

异常四:本地事务与TCC事务冲突

在try阶段我们添加了一个本地事务,如果这时候try阶段异常,那么本地事务就会回滚,所以这时候冻结张三20元的操作就会回滚,也就不会被冻结。那么这时候try阶段异常了,就会执行cancel阶段进行回滚

在cancel阶段,我们会还张三冻结的20元,这时候如果cancel执行成功,那么张三的金额就会多出20元,就会造成数据的不一致,所以一般不要加本地事务

js 复制代码
@Transaction(rollback=Exception.class)
@Hmily(comfirmMethod="confirmMethod",cancelMethod="cancelMethod")
public void try() {
  //查询张三余额信息  
  Account account = accountMapper.selectByUserId(1);
  //冻结张三20元
  account.setDJAccount(20);
  accountMapper.updateById(account);
}

异常五:空回滚

为什么会有空回滚的异常呢? 比如我们在执行try阶段的时候,由于超时了,导致TCC就去执行cancel阶段了,但是这时候try阶段还没有执行,也就是try阶段还没有冻结张三20元,这时候就造成了空回滚。

这时候我们需要引入其它手段,比如增加一张日志表,在回滚的时候,判断一下这是事务有没有执行try阶段,也就是这个事务有没有执行过try阶段,如果没有就不要执行cancel阶段的操作了。

异常六:第二阶段重复提交

第二阶段包括confirm,cancel,为什么会有重复提交呢? 因为我们不能保证confirm阶段或者cancel阶段一定能成功,如果不成功那么我们就要进行重试,

举个例子,在confirm阶段有二步数据库操作,假设扣减张三冻结20元成功,但是李四加20元失败了,这时候我们就要进行重试,但是重试的时候我们扣减张三冻结的20元已经操作成功了,所以不需要再次扣减了,所以我们要做好类似去重的操作,之前操作成功的就不要再次进行操作了

异常七:防悬挂

cancel阶段比try阶段先执行,由于网络原因导致try阶段超时,这时候就会执行cancel阶段操作,等cancel阶段执行完了,这时候try才执行,虽然事务失败了,但是这个事务已经结束了,所以这时候的try方法一定不能执行

相关推荐
threerocks14 分钟前
AI 原生软件开发生命周期手册 - 如何借助 AI,逐阶段改造软件开发生命周期
前端·javascript·后端
lzhdim17 分钟前
提高 SQL 语句执行速度的方法
java·开发语言·数据库·sql·oracle
JavaPub-rodert21 分钟前
王仕宇在 Go Context 如何解决协程泄漏与超时控制
开发语言·后端·golang·iphone·javapub·王仕宇
深漂的华哥1 小时前
Ruoyi-Plus前后端分离场景下,数据加密传输
java·spring boot·后端·开源·maven·ruoyi
落魄大学生之流水线上谋生计2 小时前
Java锁全面指南:从基础概念到企业级应用
java·开发语言
why技术2 小时前
eli5,我觉得这个全网在吹的技能,使用体验真的很一般啊。
前端·人工智能·后端
学习星球2 小时前
Qwik 框架入门实战:从开源项目 Qwik City 开始,用可恢复性替代水合
后端·前端框架·开源·c5全栈
爱学习的小白柏3 小时前
【AI问数技术】多Agent协同架构:查询规划/SQL生成/洞察分析/报告生成
java·网络·人工智能·windows·sql·架构·llama
码匠许师傅4 小时前
【C++ 面试真题】30. 聊聊 C++ 的互斥锁与读写锁
java·c++·面试
沙盘客4 小时前
AFSIM 示例解读(03)· 六自由度飞行仿真 six_dof(下):机场运作与弹道导弹投送
java·javascript·经验分享