[Seasar-user:20899] Re: 例外を握りつぶした場合のトランザクション管理について
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2011年 7月 27日 (水) 14:00:23 JST
小林 (koichik) です.
> 以下のように(サービスクラスで)insert処理を行った場合に
> SEntityExistsExceptionが発生すると処理が
> ロールバックされてしまいます。
>
> for (PageDraft pageDraft : pageDraftList) {
> pageDraft.cassetteId = cassetteId;
> try {
> insert(pageDraft);
> } catch (SEntityExistsException e) {
> log.error(e + " " + pageDraft.orderCode);
> }
> }
この場合の insert() って実質 Dao であり、トランザクション境界を
設定すべきメソッドではありませんよね。
なので、insert() や他の Dao 的なメソッドに
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
または
@TransactionAttribute(TransactionAttributeType.MANDATORY)
を指定してください。トランザクション外でも insert() 等を許可するなら前者、
許可しない (トランザクション必須) なら後者になります。
Date: Wed, 27 Jul 2011 13:06:57 +0900
From: Masao Suda <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:20898] 例外を握りつぶした場合のトランザクション管理について
> 須田と申します。
> お世話になっております。
>
> 現在以下の環境で開発を行っています。
>
> jdk:1.6.0_24
> Seasar:2.4.44
> SaStruts:1.0.4-sp8
> Eclipse:Indigo(build id:20110615-0604)
> Dolteng:0.41.0
> Apatche-tomcat:7.0.16
>
>
> データをロードするために、CSVファイルを読み込み、値をエンティティに格納
> してinsertする処理を行っているのですが、
> 以下のように(サービスクラスで)insert処理を行った場合に
> SEntityExistsExceptionが発生すると処理が
> ロールバックされてしまいます。
>
> for (PageDraft pageDraft : pageDraftList) {
> pageDraft.cassetteId = cassetteId;
> try {
> insert(pageDraft);
> } catch (SEntityExistsException e) {
> log.error(e + " " + pageDraft.orderCode);
> }
> }
>
> トランザクションの関連設定はDoltengで設定した状態から変更せず。
> サービスクラスで以下のようにして、
> @Resource
> protected UserTransaction userTransaction;
>
> userTransaction.getStatus() の値をモニタしたところ、最初に
> SEntityExistsExceptionが発生した時点(
> SEntityExistsException のcatchステートメントでステータス値をモニタした)
> で、ステータスが、
> 0から1に変更されました。デバッグしながら処理を追った感じではここでステー
> タスが変更されたため、
> ロールバックされてしまっているように見えます。
>
> CSV読み込み中でキーが重複したレコードのインサート等は無視して処理続行、
> コミットする場合、
> SEntityExistsExceptionをaddCommitRule(Class)で指定するしかないのでしょうか?
>
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
--
{
name: "Koichi Kobayashi",
mail: "[E-MAIL ADDRESS DELETED]",
blog: "http://d.hatena.ne.jp/koichik/",
twitter: "@koichik"
}
Seasar-user メーリングリストの案内