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