GTS提供一种非Spring框架下直接使用API开启事务的方式。
获取单例的全局事务操作对象
TxcTransaction txcTransaction = TxcTransaction.getInstance(vgroup, ak, sk)
其中TxcTransaction为单例对象,vgroup为客户申请的事务分组,ak/sk为用户的阿里云账号的AccessKey ID和AccessKey Secret。
开启分布式事务
txcTransaction.begin(timeout)
:timeout为设置事务超时时间,单位毫秒。开启的事务上下文会绑定到当前线程中。
提交分布式事务
txcTransaction.commit()
:根据当前线程中的事务上下文提交分布式事务。
回滚分布式事务
txcTransaction.rollback()
:根据当前线程中的事务上下文回滚分布式事务。
另一组 API 在事务进行中操作事务上下文
- 使用
String xid = TxcContext.getCurrentXid();
获取当前全局事务XID。
- 使用
TxcContext.bind(xid, null);
手工将事务上下文绑定到当前线程中。
- 使用
TxcContext.unbind();
从当前线程中清除事务上下文,与bind操作对应。
- 暂停及恢复全局事务传播。
xid = TxcContext.suspendTxcTransaction()
:临时挂起当前线程里的事务上下文。
-
TxcContext.resumeTxcTransaction(xid)
:将事务上下文恢复到当前线程,与suspendTxcTransaction操作对应。
@TxcTransaction
public void businessA()
{
String xid = TxcContext.suspendTxcTransaction();
// 调用 B
TxcContext.resumeTxcTransaction(xid);
}
- 完全手工控制全局事务边界。
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);
}
}
}