Apcoordinator ユーザーズガイド |
目次 |
第2部 Apcoordinatorコアの機能 | > 第4章 APIを使ったプログラミング | > 4.8 トランザクションの管理 |
トランザクション管理機能を使用するには、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="iso-2022-jp"?> <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
Transaction
Beginトランザクション開始 ビジネスメソッド before
Transaction
Completionトランザクション終了 after
Transaction
Completionhandle
Exception (*1)preprocess
× × × × × × × (*2) beforeTransactionBegin
− × × × × × ○ トランザクション開始 − − × ○ × ○ ○ (*1) ビジネスクラスが
- ○: 実行されます。
- ×: 実行されません。
- −: 後続の処理に該当しません。
Postprocessor
インタフェースを実装している場合に呼び出されます。
(*2)handleException
,postprocess
のどちらも呼び出されません。
ビジネスクラスがTransactionHandler
インタフェースを実装していても、ビジネスクラス設定ファイルでトランザクション管理機能が無効に設定されている場合は、beforeTransactionBegin
,beforeTransactionCompletion
,afterTransactionCompletion
メソッドは呼び出されません。
目次 |