[seasar-dotnet:517] Re: 複数テーブルのDaoで自動生成した Insert、Update、Delete文のトランザクション制御

Yusuke Mazuka [E-MAIL ADDRESS DELETED]
2007年 6月 26日 (火) 19:42:27 JST


お世話になっております。
馬塚と申します。

いつも質問してばかりなのでたまには分かる範囲で回答してみます(^^)

>1.SELECT文に対してもトランザクション・コミットが適用されているのはなぜか

diconファイルの指定で、
 <aspect>LocalTx.RequiredTx</aspect>
としているためではないでしょうか?

S2AOPのサイトに
 「pointcutを指定しない場合は、 コンポーネントが実装している
 インターフェースのすべてのメソッドが対象になります」
とあります。
http://s2container.net.seasar.org/ja/aop.html#AOPExplanationFile

トランザクションの対象としたいメソッドのみをaspectに指定する必要が
あると思います。

>2.IS2daotestServiceImpl実装クラスで1トランザクションとしたいが、DAOの
> メソッド単位にコネクションの取得→トランザクション・スタート→自動生成
> SQLの実行(または、外部SQLの実行)→トランザクション・コミット→論理コネ
> クションのクローズとなってしまう。

条件に応じてINSERTやUPDATEを行うメソッドを1つ作り、
該当メソッドのみをaspectに指定すれば良いと思います。
-----------------------------
[IS2daotestServiceImpl.cs]
public void Exec() 
{
  xxxDao.Insert();
  xxxDao.Update();
}
-----------------------------
[dicon]
<aspect pointcut="Exec">LocalTx.RequiredTx</aspect>
-----------------------------
Execメソッド内で例外が発生すれば自動的にロールバックされます。

>すみません、表題とは異なるのですが、ログが2行づつでるのはなぜでしょうか

log4netの設定で、<root>と<logger name="Seasar.Extension.ADO">など
それぞれでappenderの記述をしていませんでしょうか?
下記のようになっていると2件ずつ出力されます。
-----------------------------
<root>
  <level value="DEBUG" />
  <appender-ref ref="TraceAppender" />
</root>
<logger name="Seasar.Extension.ADO">
  <level value="DEBUG" />
  <appender-ref ref="TraceAppender" />
</logger>
-----------------------------


もし外していたらすいません。

以上よろしくお願い致します。


seasar-dotnet メーリングリストの案内