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