3.7. リソースの共有

同じトランザクショナルリソースを使い複数のトランザクションをインターリーブする場合、アプリケーションサーバーは常時、リソースに対してトランザクション1つのみを参加させるようにします。トランザクションマネージャは、同じリソースマネージャインスタンスに接続されたリソースオブジェクトのいずれかを利用し、トランザクションのcommit プロセスを開始することができます。2相コミットプロトコルに利用するリソースオブジェクトは、完了済みのトランザクションと関連付ける必要はありません。
リソースアダプタは、トランザクションのcommit 処理に対しXAResource メソッドを同時に呼び出す複数のスレッドを処理する必要があります。以下のコードは、トランザクショナルリソースr1を宣言しています。グローバルトランザクションxid1 は、r1で開始、終了されます。その後、別のグローバルトランザクションxid2r1と関連づけられます。一方で、トランザクションマネージャは、r1あるいは、同じリソースマネージャに接続されている別のトランザクショナルリソースを利用して、xid1に対し2相コミットプロセスを開始している可能性もあります。リソースアダプタは、リソースが別のグローバルトランザクションと関連付けられている間にコミットプロセスの実行を許可する必要があります。
XAResource xares = r1.getXAResource();
      
xares.start(xid1); // associate xid1 to the connection
      
..
xares.end(xid1); // disassociate xid1 to the connection
..
xares.start(xid2); // associate xid2 to the connection
..
// While the connection is associated with xid2,
// the TM starts the commit process for xid1
status = xares.prepare(xid1);
..
xares.commit(xid1, false);