「アノテーションについて」の編集履歴(バックアップ)一覧はこちら
アノテーションについて - (2010/01/06 (水) 12:50:29) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
**@Transactional
このアノテーションは、インタフェース、クラス、あるいはメソッドがトランザクションであることを指定する。デフォルトのトランザクションセマンティクスは、read/write、PROPAGATION_REQUIRED、ISOLATION_DEFAULT、TIMEOUT_DEFAULTで、ExceptionではなくRuntimeException発生時にロールバックするというものである。
アノテーションのオプションのプロパティを使えばトランザクションの設定を変更することができる。
|プロパティ|型|説明|
|propagation|enum: Propagation|オプションのプロパゲーション設定(デフォルトは、PROPAGATION_REQUIRED)|
|isolation|enum: Isolation|オプションのアイソレーションレベル(デフォルトはISOLATION_DEFAULT)|
|readOnly|boolean|read/writeあるいはリードオンリートランザクション(デフォルトはfalseもしくはread/write)|
|rollbackFor |Classオブジェクトの配列。Trowableからの派生クラスであること。|オプションで指定する、発生したときにロールバックする例外クラスの配列。デフォルトでは、チェック済みの例外ではロールバックせず、未チェックの(RuntimeExceptionから派生した)例外の場合にロールバック|
|rollbackForClassname|クラス名文字列の配列。クラスは、Trowableの派生であること。|オプションで指定する、発生したときにロールバックさせる例外クラスの名前の配列|
|noRollbackFor |Classオブジェクトの配列。Trowableからの派生であること。|オプションで指定するロールバックさせない例外クラスの配列。|
|noRollbackForClassname |クラス名文字列の配列。Trowableからの派生であること。|オプションで指定する、発生したときにロールバックさせない例外のクラス名の配列。|
*@Transactional 読み取り専用フラグの落とし穴
作業中によく陥りがちな落とし穴は、Spring の @Transactional アノテーションで、読み取り専用フラグに関して不適切な使い方をすることです。ここで簡単なクイズに答えてみてください。Java パーシスタンスに標準 JDBC コードを使用しているときに、読み取り専用フラグを true に設定し、伝播モードを SUPPORTS に設定すると、リスト 5 の @Transactional アノテーションはどのように作用するでしょうか。
リスト 5. SUPPORTS 伝播モードで読み取り専用を使用する場合 — JDBC
@Transactional(readOnly = true, propagation=Propagation.SUPPORTS)
public long insertTrade(TradeData trade) throws Exception {
//JDBC Code...
}
リスト 5 の insertTrade() メソッドが実行されたときの結果は、以下のうちのどれですか。
* 読み取り専用接続例外がスローされる
* 取引注文が正しく挿入され、データがコミットされる
* 伝播レベルが SUPPORTS に設定されているため何も行われない
お手上げですか?正解は B です。読み取り専用フラグが true に設定されていて、トランザクション伝播モードが SUPPORTS に設定されているとしても、取引注文は正しくデータベースに挿入されます。その理由を説明すると、SUPPORTS 伝播モードではトランザクションが開始されないため、メソッドは実質上、ローカル (データベース) トランザクションを使用することになるからです。読み取り専用フラグが適用されるのは、トランザクションが開始された場合のみです。上記の例ではトランザクションは開始されなかったため、読み取り専用フラグは無視されます。
*@Transactional
このアノテーションは、インタフェース、クラス、あるいはメソッドがトランザクションであることを指定する。デフォルトのトランザクションセマンティクスは、read/write、PROPAGATION_REQUIRED、ISOLATION_DEFAULT、TIMEOUT_DEFAULTで、ExceptionではなくRuntimeException発生時にロールバックするというものである。
アノテーションのオプションのプロパティを使えばトランザクションの設定を変更することができる。
|プロパティ|型|説明|
|propagation|enum: Propagation|オプションのプロパゲーション設定(デフォルトは、PROPAGATION_REQUIRED)|
|isolation|enum: Isolation|オプションのアイソレーションレベル(デフォルトはISOLATION_DEFAULT)|
|readOnly|boolean|read/writeあるいはリードオンリートランザクション(デフォルトはfalseもしくはread/write)|
|rollbackFor |Classオブジェクトの配列。Trowableからの派生クラスであること。|オプションで指定する、発生したときにロールバックする例外クラスの配列。デフォルトでは、チェック済みの例外ではロールバックせず、未チェックの(RuntimeExceptionから派生した)例外の場合にロールバック|
|rollbackForClassname|クラス名文字列の配列。クラスは、Trowableの派生であること。|オプションで指定する、発生したときにロールバックさせる例外クラスの名前の配列|
|noRollbackFor |Classオブジェクトの配列。Trowableからの派生であること。|オプションで指定するロールバックさせない例外クラスの配列。|
|noRollbackForClassname |クラス名文字列の配列。Trowableからの派生であること。|オプションで指定する、発生したときにロールバックさせない例外のクラス名の配列。|