トランザクション管理機能を使用するには、com.fujitsu.uji.transaction.TransactionHandlerインタフェースを実装してビジネスクラスを作成します。 簡単に作成したい場合は、com.fujitsu.uji.transaction.GenericTransactionHandlerクラスを継承して作成します。GenericTransactionHandlerクラスはTransactionHandlerインタフェースの簡単な実装を提供します。
デフォルトでは、Apcoordinatorによって以下のようにトランザクションが制御されます。
TransactionHandlerを実装したビジネスクラスの全てのビジネスメソッドでトランザクション管理機能が有効です。
javax.transaction.UserTransactionインタフェースを使ってトランザクションを制御します。
トランザクション開始直前に特定の処理を実行する
トランザクションの開始直前に特定の処理を実行したい場合には、ビジネスクラスのbeforeTransactionBeginメソッドにその処理を記述します。このメソッドは、トランザクション開始前に呼び出されます。
トランザクション終了直前に特定の処理を実行する
トランザクションのコミットまたはロールバックの直前に特定の処理を実行したい場合は、ビジネスクラスのbeforeTransactionCompletionメソッドにその処理を記述します。 beforeTransactionCompletionは、ビジネスメソッドの実行終了後でトランザクションをコミットまたはロールバックする直前に呼び出されます。現在のトランザクションの状況を取得するには、com.fujitsu.uji.DispatchContextクラスのgetRollbackOnlyメソッドを使用します。例外の発生やsetRollbackOnlyの実行によってロールバックすることが決定している場合、getRollbackOnlyはtrueを返します。
beforeTransactionCompletionで以下の処理を行った場合は、トランザクションはロールバックされます。
ロールバック例外を発生した場合。
DispatchContextクラスのsetRollbackOnlyメソッドを呼び出した場合。
トランザクション終了後に特定の処理を実行する
トランザクションのコミット後またはロールバック後に特定の処理を実行したい場合は、ビジネスクラスのafterTransactionCompletionメソッドにその処理を記述します。 afterTransactionCompletionは、トランザクションをコミットまたはロールバックした直後に呼び出されます。
ビジネスメソッドごとにトランザクション管理機能の動作を設定する
ビジネスメソッドごとにトランザクション管理機能の有無や追加のロールバック例外を指定するには、設定ファイルフォルダにビジネスクラス設定ファイル(handlerconfig.xml)を作成して設定を記述します。
以下は、ビジネスクラス設定ファイル(handlerconfig.xml)の記述例です。
<?xml version="1.0" encoding="Shift_JIS"?> <handlerConfig xmlns=http://interstage.fujitsu.com/schemas/uji/handlerConfig xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/handlerConfig http://interstage.fujitsu.com/schemas/uji/handlerconfig.xsd"> <config> <version>6.0</version> </config> <handler name="sample.SampleHandler"> <!-- (1) --> <method name="doUpdate"> <!-- (2) --> <transaction enabled="true"> <!-- (3) --> <rollbackException class="some.pkg.MyException"> <!-- (4) --> </transaction> </method> <method name="*"> <!-- (5) --> <transaction enabled="false"/> <!-- (6) --> </method> </handler> </handlerConfig>
(1) handlerタグでビジネスクラス1個についての設定を記述します。nameアトリビュートにビジネスクラスのクラス名をパッケージ名付きで記述します。
(2) (1)のビジネスクラスの各ビジネスメソッドの設定をmethodタグで記述します。nameアトリビュートにメソッド名を記述します。methodタグはhandlerタグのコンテントに必要なだけ繰り返して記述します。
(3) (2)のビジネスメソッドの設定をtransactionタグで記述します。transactionタグはmethodタグのコンテントに1個だけ記述します。transactionタグには以下のアトリビュートを指定します。
enabled
トランザクション管理機能を有効にするかどうかを指定します。trueを指定すると(2)のビジネスメソッドでトランザクション管理機能が有効に、falseを指定すると無効になります。このアトリビュートを省略した場合はtrueです。
(4) 必要に応じてtransactionタグのコンテントにrollbackExceptionタグを記述してロールバック例外を追加します。classアトリビュートに例外クラスをパッケージ名付きで記述します。指定されたクラスとそのサブクラスがロールバック例外に追加されます。以下のクラスは既定でロールバック例外として使用されるため、classアトリビュートに指定できません。
java.lang.RuntimeException とそのサブクラス
java.lang.Errorとそのサブクラス
(5),(6) methodタグにname="*"を指定すると、デフォルトの設定を定義できます。このデフォルトの設定は、methodタグが記述されていないメソッドや、methodタグは存在してもtransactionタグが省略されているメソッドに適用されます。
上記の記述例では、sample.SampleHandlerクラスのdoUpdateメソッドではトランザクション管理機能が有効で、その他のメソッドでは無効になります。doUpdateでは、RuntimeException、Error、それらのサブクラスに加えて、some.pkg.MyExceptionをロールバック例外として使用します。
メソッドの実行順序
トランザクション管理機能を使用した場合、ビジネスクラスのメソッドは以下の順序で呼び出されます。
ビジネスクラスがcom.fujitsu.uji.Postprocessorインタフェースを実装している場合は、postprocessメソッドとhandleExceptionメソッドのどちらか一方が呼び出されます。handleExceptionが呼ばれるのは以下の処理で例外が発生した場合です。それ以外はpostprocessが呼び出されます。
beforeTransactionBegin
トランザクション開始
ビジネスメソッド
preprocess、beforeTransactionBegin、トランザクション開始処理で例外が発生した場合、後続の処理の一部はスキップされます。例外の発生個所とスキップされる処理の関係を以下の表に示します。
例外を発生する処理 | 後続の処理の実行有無 | ||||||
---|---|---|---|---|---|---|---|
before | トランザクション開始 | ビジネスメソッド | before | トランザクション終了 | after | handle | |
preprocess | × | × | × | × | × | × | ×(*2) |
beforeTransactionBegin | - | × | × | × | × | × | ○ |
トランザクション開始 | - | - | × | ○ | × | ○ | ○ |
○: 実行されます。
×: 実行されません。
-: 後続の処理に該当しません。
(*1) ビジネスクラスがPostprocessorインタフェースを実装している場合に呼び出されます。
(*2) handleException, postprocessのどちらも呼び出されません。
注意
ビジネスクラスがTransactionHandlerインタフェースを実装していても、ビジネスクラス設定ファイルでトランザクション管理機能が無効に設定されている場合は、beforeTransactionBegin, beforeTransactionCompletion, afterTransactionCompletionメソッドは呼び出されません。