TCC模式是一种高并发性能的全局事务协议,本文主要介绍基于SpringBoot框架的应用使用TCC模式接入GTS服务的主要流程。
前提条件
- 开通GTS服务
- 创建事务分组
条件和约束
由于TCC模式执行的两阶段操作都由开发者根据业务需要定义,与持久层无关,因此使用TCC模式没有任何条件和约束。
操作步骤
步骤一:添加依赖
准备好您需要接入GTS服务的SpringBoot应用工程,确保SDK包已经成功引入,即下列maven坐标已被添加到pom文件中:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<exclusion>
<artifactId>seata-spring-boot-starter</artifactId>
<groupId>io.seata</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.ctg.mse</groupId>
<artifactId>nacos-client-aksk-auth-plugin</artifactId>
<version>1.0.0</version>
</dependency>
步骤二:添加GTS事务分组配置
进入GTS控制台下的事务分组列表,在您创建的事务分组右侧点击“显示配置”,粘贴文本框中的所有配置。在您工程中的application.properties配置文件中添加这些配置项。若您使用application.yaml,则需要将配置项修改为对应的格式。

步骤三:添加全局事务注解
在您需要实现全局事务的业务范围的方法上方,标注@GlobalTransactional注解。在TCC模式下,在方法抛出异常时GTS不会自动去回滚全局持久化操作,而是会执行TCC两阶段操作中的Cancel操作。在方法正常执行时,会执行TCC两阶段操作中的Commit操作。下文会介绍两阶段操作的具体定义,以及如何将原先的业务拆分为两阶段操作。

步骤四:将业务拆分成两阶段操作
在TCC模式中,原先每一个应用的业务都需要被拆分为两阶段操作(Try和Commit / Rollback)。因此,需要为自己的业务定义两阶段操作的具体执行内容,本实例演示将一个简单的订单插表操作分解为三部分:Try、Commit和Rollback。
首先,定义两阶段操作接口,在接口上方标注@LocalTCC注解进行激活。在下面的TCC业务接口中,prepare方法、commit方法和rollback方法分别对应Try、Commit和Rollback三个操作。
@LocalTCC
public interface OrderTccAction {
/**
* Prepare boolean.
*
* @param actionContext the action context
* @return the boolean
*/
@TwoPhaseBusinessAction(name = "OrderTccAction", commitMethod = "commit", rollbackMethod = "rollback")
public boolean prepare(BusinessActionContext actionContext,
@BusinessActionContextParameter(paramName = "userId") Long userId,
@BusinessActionContextParameter(paramName = "goodsId") Long goodsId,
@BusinessActionContextParameter(paramName = "num") Long num);
/**
* Commit boolean.
*
* @param actionContext the action context
* @return the boolean
*/
public boolean commit(BusinessActionContext actionContext);
/**
* Rollback boolean.
*
* @param actionContext the action context
* @return the boolean
*/
public boolean rollback(BusinessActionContext actionContext);
}
然后,编写实现类,实现TCC业务接口。通常来说,在Try阶段需要进行数据准备和校验,例如检测订单是否为正常可生成的状态、库存是否充足、余额的冻结等等;在Commit阶段需要进行真正的业务完成,例如生成订单、扣减库存、余额等等;在Cancel阶段需要进行数据恢复,例如将冻结的余额解冻等等。
@Service
public class OrderTccActionImpl implements OrderTccAction {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public boolean prepare(BusinessActionContext actionContext, Long userId, Long goodsId, Long num) {
//数据准备阶段,目前什么都不做
return true;
}
@Override
public boolean commit(BusinessActionContext actionContext) {
//业务真正执行阶段
Integer userId = (Integer) actionContext.getActionContext().get("userId");
Integer goodsId = (Integer) actionContext.getActionContext().get("goodsId");
Integer num = (Integer) actionContext.getActionContext().get("num");
jdbcTemplate.update("INSERT INTO goods_order ( user_id, goods_id, goods_num ) VALUES ( ?, ?, ? )",
new Object[] {userId, goodsId, num});
log.info("TccActionTwo commit success");
return true;
}
@Override
public boolean rollback(BusinessActionContext actionContext) {
//回滚,目前什么都不做
log.info("TccActionTwo rollback, do nothing");
return true;
}
}
最后,在标注了@GlobalTransactional注解的方法内部调用上述定义的TCC业务接口的Try方法,即可将这个TCC业务操作作为一个分支事务,纳入到GTS的管控中。

在下游应用的相关方法中,使用同样的步骤定义TCC业务接口,并调用Try方法,即可完成分支事务托管。和AT模式相似,下游应用无需再标注@GlobalTransactional注解,但是记得在TCC业务接口上方标注@LocalTCC注解进行激活。
步骤五:观察执行结果
您可以在@GlobalTransactional生效的方法内部添加rpc调用,来观察全局事务的执行情况,目前支持的rpc调用形式包括RestTemplate、Feign和Dubbo。事务执行提交或回滚后,可在GTS控制台事务分组列表,对应分组右侧的“监控”处,查看全局事务的运行统计信息。
