try {
InitialContext initial = new InitialContext();
UserTransaction ut = (UserTransaction) initial.lookup("java:comp/UserTransaction");
SessionAHome aHome = (SessionAHome) initial.lookup("SessionA");
SessionA a = aHome.create();
SessionBHome bHome = (SessionBHome) initial.lookup("SessionB");
SessionB b = bHome.create();
ut.begin();
a.fa();
b.fb();
ut.commit();
} catch (...) { ut.rollback(); }
ut 與 a、b 之間程式碼上無明顯關聯,JTS 如何知道:
ut.begin() 時,將交易上下文傳播到 a.fa() 與 b.fb() 操作的資源管理器?ut.commit() 時,對這兩個資源管理器進行兩階段提交?ut.begin() 會將交易上下文綁定到當前執行緒(ThreadLocal 機制)。a.fa()、b.fb() 時,Stub/Skeleton 機制自動將當前執行緒的交易上下文透過 RMI-IIOP 傳遞給伺服器端。ut.commit() 觸發交易管理器協調所有參與資源管理器進行 Prepare/Commit。「澳妙」在於 JTS/OTS 規範定義的執行緒綁定傳播機制,以及容器與 Stub/Skeleton 的自動協作。開發者只需取得 UserTransaction 並 demarcation,容器負責其餘所有關聯與協調工作。