tcc-transaction 简单使用方法
tcc-transactoin 作为 github 开源 tcc 分布式事务框架,可以异步处理,也可以同步处理。本文使用 Dubbo 实现分布式系统间的 RPC 调用实现,官方也提供了 tcc-transactoin-dubbo 为 Dubbo 框架的 TCC 事务提供支持。
一. TCC 事务三个阶段
TCC 事务的三个阶段:
- Try: 尝试执行业务
- 完成所有业务检查(一致性)
- 预留必须业务资源(准隔离性)
- Confirm: 确认执行业务
- 真正执行业务
- 不作任何业务检查
- 只使用 Try 阶段预留的业务资源
- Confirm 操作必须满足幂等性
- Cancel: 取消执行业务
- 释放 Try 阶段预留的业务资源
- Cancel 操作必须满足幂等性
整体流程:
二. SpringBoot + Dubbo + tcc-transaction
2.1 引入依赖
<!--tcc-transaction 整合 dubbo 核心包--> <dependency> <groupId>org.mengyun</groupId> <artifactId>tcc-transaction-dubbo</artifactId> <version>${tcc-transaction.version}</version> <exclusions> <exclusion> <artifactId>dubbo</artifactId> <groupId>org.apache.dubbo</groupId> </exclusion> </exclusions> </dependency> <!--tcc-transaction 核心包--> <dependency> <groupId>org.mengyun</groupId> <artifactId>tcc-transaction-spring</artifactId> <version>${tcc-transaction.version}</version> </dependency>
需要注意的是 tcc-transaction
官方并未将 jar 上传至 Maven 仓库,所以如果我们项目需要使用到 tcc-transaction
需要自己手动将 jar 包打入本地仓库或者私服中。
2.2 tcc-transaction 配置
@Configuration public class TccTransactionConfig { //没有持久化能力,仅可用于测试 //@Bean("transactionRepository") //public TransactionRepository memoryStoreTransactionRepository(){ // MemoryStoreTransactionRepository repository = new MemoryStoreTransactionRepository(); // repository.setDomain("TCC:DUBBO:CAPITAL:"); // return repository; //} @Bean("transactionRepository") public TransactionRepository memoryStoreTransactionRepository2(JedisPool jedisPool) { RedisTransactionRepository repository = new RedisTransactionRepository(); repository.setDomain("TCC:DUBBO:CAPITAL:"); repository.setJedisPool(jedisPool); return repository; } }
启动类加上注解:
@SpringBootApplication @EnableDubbo(scanBasePackages = "cn.bigcoder.demo.tcc.transaction.order.service") @MapperScan("cn.bigcoder.demo.tcc.transaction.order.dao") @ComponentScan("cn.bigcoder.demo.tcc.transaction") @EnableTccTransaction //加上该注解,开启 tcc 事务 public class TccTransactionDubboOrderApplication { public static void main(String[] args) { SpringApplication.run(TccTransactionDubboOrderApplication.class, args); } }
三. 业务代码引入 TCC 事务
在接口方法上加上@EnableTcc(1.7.x 新增注解,1.6.x 是@Compensable)将提供的接口标记为 tcc 接口:
public interface CapitalTradeOrderService { @EnableTcc public String record(CapitalTradeOrderDto tradeOrderDto); }
配置 TCC 事务的 Try、Confirm、Cancel 方法:
- asyncConfirm = false:是否异步处理 confirm 阶段,默认 false,也就是同步处理
- asyncCancel = false:是否异步处理 cancel 阶段,默认 false,也就是同步处理
@Override @Compensable(confirmMethod = "confirmRecord", cancelMethod = "cancelRecord", transactionContextEditor = DubboTransactionContextEditor.class) @Transactional public String record(CapitalTradeOrderDto tradeOrderDto) { ... }
如果 Try
阶段成功, Confirm
阶段必须成功,如果 Confirm
阶段抛出异常,则会重试 Confirm
阶段
@Transactional public void confirmRecord(CapitalTradeOrderDto tradeOrderDto) { //confirm 阶段 } @Transactional public void cancelRecord(CapitalTradeOrderDto tradeOrderDto) { //cancel 阶段 }
这样一个基本的 TCC 事务就配置好了,具体项目配置可以参考 bigcoder84/tcc-transaction-demo ,该项目是根据官方 demo 改造出来的 tcc-transaction 示例。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 什么是 TCC 事务?
下一篇: 谈谈自己对于 AOP 的了解
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论