[Seasar-user:20900] Re: 例外を握りつぶした場合のトランザクション管理について

Masao Suda [E-MAIL ADDRESS DELETED]
2011年 7月 27日 (水) 15:25:07 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() 等を許可するなら前者、
> 許可しない (トランザクション必須) なら後者になります。
試しに、上記 insert メソッド (S2JDBC-Gen 2.4.43が自動生成した
AbstractServiceクラスのメソッド)に
@TransactionAttribute(TransactionAttributeType.SUPPORTS) を指定したとこ
ろ、期待していた動作になりました。
@TransactionAttribute(TransactionAttributeType.MANDATORY) を指定した場合
は、ロールバックしてしまいました。
SUPPORTS指定で先に書いた(CSVファイルからのデータ登録)処理に関しては期待
した動作という事になりますが、画面入力された値からエ ンティティを生成す
る場合など、SEntityExistsExceptionが発生した場合でロールバックさせたい場
合がある事を考えると、 insertと処理内容は別のメソッドをAbstractSericeに
用意する等の方法を採る事になるかと思います。

ありがとうございました。
>
> 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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>



Seasar-user メーリングリストの案内