[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 メーリングリストの案内