WebLogic Workshop におけるデフォルトのトランザクションの動作

Web サービスでメソッドまたはコールバックが呼び出されるたびに、WebLogic Workshop は、そのメソッドまたはコールバックに関連付けられた暗黙的なトランザクションを開始します。メソッドまたはコールバックが例外を送出することなく成功すると、トランザクションはコミットされます。メソッドまたはコールバックが失敗すると、トランザクションはロールバックされ、そのトランザクション コンテキスト内で起こったどの変更もコミットされません。

トランザクション コンテキスト内で起こるのは、現在の会話の状態に対する変更、データベース、タイマー、EJB、および JMS の各コントロールのメソッド呼び出しなどです。メソッドがある時点で失敗すると、メソッドによって実行された処理、会話の状態に対する変更、および各コントロールによって実行された処理は、元の状態にロールバックされます。たとえば、Web サービスのメソッドがデータベース コントロールのメソッドを呼び出してテーブルを作成し、Web サービスのメソッドが以降の別の呼び出しで失敗した場合、データベース処理はロールバックされます。

サービス コントロールまたはアプリケーション ビュー コントロールによって実行された処理は、Web サービスのメソッドまたはコールバックのトランザクション コンテキストには含まれていません。Web サービスのメソッドが、サービス コントロールのメソッドまたはコールバックの呼び出し成功の後で失敗した場合、サービス コントロールによって実行された処理はロールバックされません。

サービス コントロールが Web サービスのトランザクション コンテキストにある程度まで含まれている場合もあります。サービス コントロールのメソッドにメッセージ バッファがある場合、そのメソッドのキューは Web サービス メソッドのトランザクション コンテキストに含まれます。つまり、サービス コントロールのバッファされたメソッドの呼び出し後に障害が発生した場合、メソッドは呼び出されません。

会話に参加している Web サービス メソッドで例外が発生した場合、トランザクションは予定どおりロールバックされますが、それがどのように会話の状態に影響するかは、例外が処理されたかどうかによって異なります。例外が処理された場合、会話の状態は更新されます。例外が処理されなかった場合、会話の状態は更新されません。会話を開始するメソッドで未処理の例外が発生した場合、会話は開始されません。会話を継続または終了するメソッドで未処理の例外が発生した場合、会話の状態は更新されません。

メソッドが成功したかどうかに関係なく会話の状態を更新するには、以下の例で示すように、例外を再送出せずに処理してください。

/**
 * @operation
 * @conversation finish
 */
public void finish()
{
try
    {
    bank.cancelAnalysis()
    }
catch (ProxyException pe)
    {
    // Log the error, but don't rethrow.
    }
}

Web サービスで使用される特定のコントロールがサービスのトランザクションに参加するかどうかは、コントロールによって公開されているリソースがどのようにコンフィグレーションされているかによります。たとえば、データベース コントロールによって公開されているデータベースは、Web サービスのトランザクションに参加するために、トランザクション接続プールを使用するようにコンフィグレーションする必要があります。エンタープライズ JavaBean(EJB)は、既存のトランザクションをサポートできます。または、Web サービスのトランザクションに参加するのではなく、固有のトランザクションを作成するようコンフィグレーションすることも可能です。サービスを構築している際に、使用しているリソースが分散トランザクションに参加するためにどのようにコンフィグレーションされているかを考慮する必要があります。

デフォルトでは、Web サービスによって開始された暗黙的なトランザクションは 5 分後にタイムアウトします。Web サービスで 5 分以上かかるデータベース操作を実行する場合、トランザクションは操作が完了する前にタイムアウトする可能性があります。この問題を解決するには、トランザクション対応としてコンフィグレーションされていないデータ ソースを使用する方法があります。他には、トランザクションのタイムアウト間隔を指定するプロパティを変更する方法もあります。以下のコードの抜粋では、このプロパティの設定方法を示します。

import javax.transaction.Transaction;
import weblogic.transaction.TxHelper;
import weblogic.transaction.internal.TransactionImpl;
...
Transaction tx = TxHelper.getTransaction();
if (tx instanceof TransactionImpl)
    {
    ((TransactionImpl)tx).setProperty(weblogic.transaction.internal.Constants.TX_TIMEOUT_SECS_PROPNAME,
                    new Integer(nSeconds));
    }

詳細については、edocs.beasys.co.jp の以下のトピックを参照してください。

トランザクションの管理

WebLogic JTA プログラマーズ ガイド

関連トピック

トランザクションの基礎