该样例工程介绍 TCC 模式下补偿型事务的简单使用方法,即如何通过 GTS 保证下订单、扣库存两个操作事务的一致性。

前提条件

在搭建预留型事务样例前,需要先完成以下操作:

背景信息

TCC 模式下,GTS 允许应用介入事务的两阶段提交。补偿型事务中,需要应用在第一阶段做实现具体业务的操作,第二阶段实现提交或者回滚操作。

样例逻辑说明

本样例模拟了用户下订单、减库存的业务逻辑。客户端(MTResourceCompensateClient)通过调用订单服务(MtServiceRollin)创建订单,之后通过调用库存服务(MtServiceRollout)扣库存。其中订单服务读写订单库,库存服务读写库存数据库,由 GTS 保证跨服务事务的一致性。

在 TCC 模式下,对于每一个业务表,需要创建一个临时业务表用于临时存储业务数据。例如对于 Orders 表需要创建对应的临时表 temp_orders,Stock 表需要创建临时表 temp_stock,临时表必须包含 xid 和 branchid 两个字段。下面以库存服务为例进行说明。

  • 在一阶段,即 rollout 方法中首先将相关业务数据商品 ID(pid)和商品数据(number)插入到临时表 temp_stock 中用于后续失败的回滚,之后判断库存是否充足。如果库存不足,直接抛出异常;如果库存充足,执行具体扣库存操作。
  • 第二阶段,如果执行成功,只需将一阶段插入到临时表中的业务数据删除即可;如果执行失败,则调用回滚方法。

构建样例工程

  1. 使用 sample-txc-mt-compensate-simpl.sql 在第一个数据库创建 Orders 表和 temp_orders 表,在第二个数据库创建 Stock 表和 temp_stock 表。
  2. 下载样例 txc-yun-sample并上传到 ECS 上。
  3. sample-txc-mt-compensate-simple /src/main/resources 路径下打开 mt-client-context.xml 文件,修改样例配置。
    1. 将该文件中的两个数据源分别替换为两个 RDS 的数据源。
    2. 将该文件中 constructor-arg value 的值替换为此前申请的 GTS 事务分组 ID。
    3. 将该文件中 accessKeysecretKey 的值修改为您实际账号的值。
  4. 在 sample-txc-mt-compensate-simple 目录下执行 build.sh,编译样例工程。

结果验证

编译完成后,在 sample-txc-mt-compensate-simple/client/bin 目录下执行 run.sh,查看运行结果。