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);
}
}
}