3.7. リソースの共有
同じトランザクショナルリソースを使い複数のトランザクションをインターリーブする場合、アプリケーションサーバーは常時、リソースに対してトランザクション1つのみを参加させるようにします。トランザクションマネージャは、同じリソースマネージャインスタンスに接続されたリソースオブジェクトのいずれかを利用し、トランザクションの
commit
プロセスを開始することができます。2相コミットプロトコルに利用するリソースオブジェクトは、完了済みのトランザクションと関連付ける必要はありません。
リソースアダプタは、トランザクションの
commit
処理に対しXAResource
メソッドを同時に呼び出す複数のスレッドを処理する必要があります。以下のコードは、トランザクショナルリソースr1
を宣言しています。グローバルトランザクションxid1
は、r1
で開始、終了されます。その後、別のグローバルトランザクションxid2
がr1
と関連づけられます。一方で、トランザクションマネージャは、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);