当前位置: 首页 > 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.xdnf.cn/news/1302049.html

相关文章:

  • 基于RobustVideoMatting(RVM)进行视频人像分割(torch、onnx版本)
  • 力扣 —— 二分查找
  • [优选算法专题二滑动窗口——无重复字符的最长子串]
  • docker 安装 使用
  • QT在Widget类下的四种QPushbutton的信号与槽的连接方式
  • Python中推导式和表达式
  • QT(事件)
  • 【机器学习深度学习】客观评估训练程度
  • AIoT浪潮之巅:AI如何赋能边缘物联网,解锁三大核心潜能
  • Spring中存在两个相同的Bean是否会报错?
  • Java 大视界 -- Java 大数据在智能教育虚拟学习环境构建与学习体验增强中的应用(399)
  • STM32F103C8T6学习——直接存储器访问(DMA)标准库实战3(ADC数据采集+DMA回传)
  • 开始回溯的学习
  • I/O多路复用特性与实现
  • 【学习嵌入式day-25-线程】
  • 扣子(Coze),开源了!Dify 天塌了
  • 无人机智能跟踪模块设计与运行分析
  • Mac Mysql 卸载
  • 【Docker】openEuler 使用docker-compose部署gitlab-ce
  • C++设计模式:类间关系
  • 企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
  • Flinksql bug: Heartbeat of TaskManager with id container_XXX timed out.
  • gitee_流水线搭配 Dockerfile 部署vue项目
  • MetaFox官方版:轻松转换视频,畅享MKV格式的便捷与高效
  • 【Linux基础知识系列】第九十六篇 - 使用history命令管理命令历史
  • std::set_symmetric_difference
  • 4. 图像识别模型与训练策略
  • 解锁AI大模型:Prompt工程全面解析
  • Spring MVC ModelAndView 详解
  • Linux网络基础(一)