当前位置: 首页 > news >正文

金融项目高可用分布式TCC-Transaction(开源框架)

跨行转账:TCC解决银行间账户余额同步问题
订单支付:Try阶段预扣库存,Confirm阶段实际扣款
对账系统:批量交易的事务一致性保障

一、添加依赖

<!-- Maven 依赖 -->
<dependency><groupId>org.mengyun</groupId><artifactId>tcc-transaction-core</artifactId><version>1.2.0</version>
</dependency>
<dependency><groupId>org.mengyun</groupId><artifactId>tcc-transaction-spring</artifactId><version>1.2.0</version>
</dependency>

二、SpringBoot配置

#application.yml
tcc:transaction:repository:type: redis  # 事务日志存储类型(支持JDBC、ZooKeeper等)redis:host: 127.0.0.1port: 6379recover:cron: "0 */1 * * * ?"  # 定时任务补偿间隔(默认1分钟)

三、TCC接口与实现

@Conpensable(confirmMethod = "confirmTransfer",cancelMethod = "cancelTransfer",asyncConfirm = false //是否异步Confirm(高并发场景建议true)
)
public interface PaymentService{@Transactionalboolean tryTransfer(@BusinessActionContextParameter(paramName = "fromAccount") String fromAccount,@BusinessActionContextParameter(paramName = "toAccount") String toAccount,@BusinessActionContextParameter(paramName = "amount") BigDecimal amount);boolean confirmTransfer(BusinessActionContext context);boolean canelTransfer(BusinessActionContext context);
}
@Service
public class PaymentServiceImpl implements PaymentService {@Autowiredprivate AccountDao accountDao;@Overridepublic boolean tryTransfer(String fromAccount, String toAccount, BigDecimal amount) {// 1. Try阶段:资源预留(冻结余额)Account account = accountDao.selectForUpdate(fromAccount);if (account.getBalance().compareTo(amount) < 0) {throw new InsufficientBalanceException();}accountDao.freezeAmount(fromAccount, amount);  // 生成冻结记录// 2. 记录事务上下文(自动由框架处理)return true;}@Overridepublic boolean confirmTransfer(BusinessActionContext context) {// 3. Confirm阶段:实际扣款String fromAccount = context.getActionContext("fromAccount");BigDecimal amount = context.getActionContext("amount");accountDao.decreaseBalance(fromAccount, amount);accountDao.unfreezeAmount(fromAccount, amount);return true;}@Overridepublic boolean cancelTransfer(BusinessActionContext context) {// 4. Cancel阶段:释放冻结资金String fromAccount = context.getActionContext("fromAccount");BigDecimal amount = context.getActionContext("amount");accountDao.unfreezeAmount(fromAccount, amount);return true;}
}

四、启动TCC事务

@Service
public class TransferFacade {@Autowiredprivate PaymentService paymentService;@Autowiredprivate TransactionRepository transactionRepository;@Transactionalpublic void executeTransfer(String fromAccount, String toAccount, BigDecimal amount) {// 1. 创建事务上下文TransactionContext context = new TransactionContext();context.setPropagated(true);// 2. 执行Try阶段boolean tryResult = paymentService.tryTransfer(fromAccount, toAccount, amount);if (!tryResult) {throw new TryPhaseException("Try阶段失败");}// 3. 模拟其他服务调用(如风控检查)riskCheckService.validate(fromAccount, amount);// 4. 事务自动提交(框架自动触发Confirm)}
}
http://www.lryc.cn/news/621827.html

相关文章:

  • 服装企业客户满意度调查:民安智库的市场调研赋能实践(北京市场调查)
  • 汽车行业 AI 视觉检测方案(二):守护车身密封质量
  • 指针类型:解引用与运算的关键
  • 电子电气架构 --- 探索软件定义汽车(SDV)的技术革新
  • 基于多模型的零售销售预测实战指南
  • Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
  • 【java】对word文件设置只读权限
  • 英文PDF翻译成中文怎么做?试试PDF翻译工具
  • Canal 技术解析与实践指南
  • ffmpeg 安装、配置与使用完全指南
  • 【python实用小脚本-187】Python一键批量改PDF文字:拖进来秒出新文件——再也不用Acrobat来回导
  • fastdds.ignore_local_endpoints 属性
  • PDF Replacer:高效便捷的PDF文档内容替换专家
  • 基于 Spring AI + Ollama + MCP Client 打造纯本地化大模型应用
  • JavaScript(JS)DOM(四)
  • 大模型微调分布式训练-大模型压缩训练(知识蒸馏)-大模型推理部署(分布式推理与量化部署)-大模型评估测试(OpenCompass)
  • MuMu模拟器Pro Mac 安卓手机平板模拟器(Mac中文)
  • 代码随想录Day51:图论(岛屿数量 深搜广搜、岛屿的最大面积)
  • 解决量化模型中的 NaN 问题:为何非量化层应选用 FP32?(41)
  • 波浪模型SWAN学习(1)——模型编译与波浪折射模拟(Test of the refraction formulation)
  • Docker安装——配置国内docker镜像源
  • flutter 跨平台编码库 protobuf 工具使用
  • RAGFlow入门
  • Trae2.0:AI 编程新时代的引领者
  • 反射和类加载机制
  • 智能算法突破动态挑战,效率革命重塑计算未来!
  • (自用)console.log怎么上色
  • 使用转换函数重载布尔值类
  • 读《精益数据分析》:黏性(Stickiness)—— 验证解决方案是否留住用户
  • 自适应UI设计解读 | Fathom 企业人工智能平台