GTS 提供一种非 Spring 框架下直接使用 API 开启事务的方式。

获取单例的全局事务操作对象

TxcTransaction txcTransaction = TxcTransaction.getInstance(vgroup, ak, sk)

其中 TxcTransaction 为单例对象,vgroup 为客户申请的事务分组,ak/sk 为用户的阿里云账号的 Access Key ID 和 Access Key Secret。

开启分布式事务

txcTransaction.begin(timeout)timeout 为设置事务超时时间,单位毫秒。开启的事务上下文会绑定到当前线程中。

提交分布式事务

txcTransaction.commit():根据当前线程中的事务上下文提交分布式事务。

回滚分布式事务

txcTransaction.rollback():根据当前线程中的事务上下文回滚分布式事务。

另一组 API 在事务进行中操作事务上下文

说明 可以参考 txc-yun-sample 中的sample-txc-simple-springfree 样例sample-txc-dubbo 样例了解 API 的使用方式。
  1. 使用 String xid = TxcContext.getCurrentXid(); 获取当前全局事务 XID。
  2. 使用 TxcContext.bind(xid, null); 手工将事务上下文绑定到当前线程中。
  3. 使用 TxcContext.unbind(); 从当前线程中清除事务上下文,与 bind 操作对应。
  4. 暂停及恢复全局事务传播。
    • xid = TxcContext.suspendTxcTransaction():临时挂起当前线程里的事务上下文。
    • TxcContext.resumeTxcTransaction(xid) :将事务上下文恢复到当前线程,与 suspendTxcTransaction 操作对应。

      @TxcTransaction
      public void businessA()
      {
          String xid = TxcContext.suspendTxcTransaction();
          // 调用 B
          TxcContext.resumeTxcTransaction(xid);
      }                           
  5. 完全手工控制全局事务边界。
    public void myBusinessWithGlobalTransaction() {
         // 创建一个全局事务实例
         TxcTransaction tx = TxcTransaction.getInstance("myTxcVgroup", "myAK", "mySK");
    
         String xid = null;
         try {
             // 全局事务开启
             tx.begin(60000);
             // 建议把 xid 打印到应用日志中,方便问题排查
             xid = TxcContext.getCurrentXid();
             logger.info("GTS Tx Begins: " + xid);
    
         } catch (TxcException ex) {
             // 开启事务失败
             throw new MyBusinessException(ex);
         }
    
         try {
             // 业务逻辑
    
             // 全局事务提交
             tx.commit();
             logger.info("GTS Committed: " + xid);
         } catch (Throwable ex) {
             try {
                 // 全局事务回滚
                 tx.rollback();
                 logger.info("GTS Rollbacked: " + xid);
             } catch (Throwable rollbackFailed) {
                 // 打印回滚异常并记录 xid 以备数据核验
                 logger.error("Failed to rollback: " + xid, rollbackFailed);
             }
    
         }
    
     }