第8回 J2EEのトランザクション処理


 トランザクション属性の特長


 

 Required

 この属性が設定されている場合、次のようなトランザクション処理が行われます。あるトランザクションの下にクライアントがあった場合で、クライアントがビーンのメソッドを呼び出したとします。このとき、このメソッドの実行は、クライアントが属するトランザクションの下で行われます。もし、クライアントがトランザクションの下になかったら、コンテナは、メソッドを走らせる前に、新しいトランザクションを開始します。この属性は、たいていのトランザクション処理に対して有効で、デフォルトのトランザクション属性として使うことができるでしょう。

 先に触れたpreInvokeTxメソッドの、このREQUIRED属性を処理している部分を見てみましょう。

..............
case 2: // TX_REQUIRED
  if(isNullTx)
      throw new TransactionRequiredException();
  if(status == 6) // TX_NEVER
  { // クライアントがトランザクションの下になかったら、
     // コンテナは、新しいトランザクションを開始する。
       inv.clientTx = null;
       startNewTx(prevTx, inv);
  } else
  { // そうでなかったら、このメソッドの実行は、クライアントが
     // 属するトランザクションの下で行われる。
       inv.clientTx = transactionManager.getTransaction();
       useClientTx(prevTx, inv);
  }
  break;
..............
..............


 

 RequireNew

 この属性は、クライアントにトランザクションの下になかったら、メソッドの呼び出しに際して新しいトランザクションを始めるという点では、先のRequierdと同じですが、クライアントがあるトランザクションの下で走っている時には、次のような処理を行います。

 まず、クライアントのトランザクションを一時停止します。そして、新しいトランザクションを開始してその下でメソッドを呼び出します。メソッドの呼び出しが終わったら、元のクライアントのトランザクションを復活させます。

 この属性を使えば、メソッドの呼び出しは、必ず、新しいトランザクションの下で行われるようにすることが出来ます。

preInvokeTxメソッド
case 4: // TX_REQUIRES_NEW
   if(status != 6) // TX_NEVER
      inv.clientTx = transactionManager.suspend();
   startNewTx(prevTx, inv);
   break;

postInvokeTxメソッド
case 4: // TX_REQUIRES_NEW
   newException = completeNewTx(context, exception);
   if(inv.clientTx != null)
      transactionManager.resume(inv.clientTx);
   break;


 

 Mandatory

  あるトランザクションの下にクライアントがあった場合、ビーンのメソッドの実行は、クライアントの属するトランザクションの下で行われます。もし、クライアントがトランザクションの下になかったら、コンテナは、TransactionRequiredException例外を投げます。

 この属性は、結局、すべてのメソッド呼び出しが、クライアントのトランザクションの下で行われるべきことを要求しています。

preInvokeTxメソッド
case 5: // TX_MANDATORY
   if(isNullTx || status == 6) // TX_NEVER
      throw new TransactionRequiredException();
   useClientTx(prevTx, inv);
   break;


 

 NotSupported

 あるトランザクションの下にクライアントがあって、ビーンのメソッドを呼び出した場合、コンテナは、メソッドの呼び出し前にクライアントのトランザクションを一時停止し、メソッドの実行が終わってからそれを復活します。もし、クライアントがトランザクションの下になかったら、コンテナは、メソッドの呼び出しに際して、新しいトランザクションを始めることはしません。

 この属性を使えば、メソッドは、コンテナの生成するトランザクションの下では、決して実行されないことになります。

 

 Supports

 あるトランザクションの下にクライアントがあった場合、ビーンのメソッドの実行は、クライアントの属するトランザクションの下で行われます。もし、クライアントがトランザクションの下になかったら、コンテナは、メソッドの呼び出しに際して、新しいトランザクションを始めることはしません。

 この属性の場合には、トランザクションの働きは、同じメソッドでも変わることがありますので、注意が必要です。

 

 Never

 トランザクションの下で走っているクライアントが、ビーンのメソッドを呼び出そうとすると、コンテナは、RemoteExceptionを投げます。もし、クライアントがトランザクションの下になかったら、コンテナは、メソッドの呼び出しに際して、新しいトランザクションを始めることはしません。

4/5

J2EEの基礎(第8回)
  コンピューティングにおけるトランザクションの必要性
  トランザクションの基礎を知る
  J2EEのトランザクション
トランザクション属性の特長
  トランザクション属性

連載内容
J2EEの基礎
  第1回 Java Pet Storeで、J2EEを体験する(1)
  第2回 Java Pet Storeで、J2EEを体験する(2)
 

第3回 J2EEアプリケーションと配置(deployment)

  第4回 J2EEアプリケーションを構成するコンポーネント
  第5回 データベースのブラウザを作る
  第6回 EJBにおけるコンテナとコンポーネント
  第7回 J2EEのセキュリティのキホンを知る
第8回 J2EEのトランザクション処理


連載記事一覧




Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間