[Seasar-user:17366] Re: トランザクション処理について

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2009年 5月 1日 (金) 16:00:10 JST


小林 (koichik) です.

Date:    Fri, 1 May 2009 10:53:51 +0900
From:    もぁーぃ <[E-MAIL ADDRESS DELETED]>
To:      <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:17359] Re: トランザクション処理について

> 一度エラーが発生すると処理3で実施したsave()の内容が残っているようで、
> エラーが発生した後に行われるトランザクションの処理1の
> createQuery実行時にInsertとして処理されてしまうために、

それはあり得ないでしょう.
スタックトレースを確認するなどして,状況を
正しく理解した方がよいかと.

> <property name="allowLocalTx">false</property>については
> 
> http://ml.seasar.org/archives/seasar-user/2006-July/004117.html
> 
> のページを参考にさせていただいて設定を行った部分となっております。

自動コミットモードでの DB アクセスを許すかどうかは
プロジェクトごとのポリシーで決めてください.

プロジェクトのポリシーとして自動コミットモードでの
DB アクセスを許さないのであれば (allowLocalTx=false は
そういう意味です),それに従って実装してください.

> 現在の問題は、
> 
> > コンストラクタで Hibernate Session を使用するのをやめる
> > 手動でトランザクションを開始する
> 
> と返信いただいたのですが、具体的にどのように対処すればいいのか
> 分からない状態となっております。

・コンストラクタで Hibernate Session を使用するのをやめる

ConfirmServiceImpl の 35 行目で
S2SessionFactoryImpl#getSession を呼び出して
何か処理をしていますよね?
それを別のメソッド,例えば init() に切り出して,
ConfirmServiceImpl を提起している dicon ファイルで

<component class="...ConfirmServiceImpl">
  <aspect>j2ee.requiredTx</aspect>
  <initMethod name="init"/>
</component>

のようにすれば init() メソッドは AOP で
宣言的トランザクションが適用されるので,
allowLocalTx が false でも例外にならなくなります.
# init() は public にする必要があります.

・手動でトランザクションを開始する

これはやめた方がいいでしょう.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



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