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

KIYOSUE Minoru [E-MAIL ADDRESS DELETED]
2007年 6月 26日 (火) 19:13:08 JST


お世話になっております、清末と申します。

先日、S2Dao.dllがロードされない件に続き、自動生成のSQL(Insert/Update/
Delete)で、トランザクションが効かない状況も無事解決することができ、実装
も順調に進んでおりましたが、以下のようなサービスでのトランザクション処理
が意図する通りとなってくれません。


サービス呼び出し側 : s2daotest

    ' 直接S2Containerからコンポーネントを取得する際には、GetComponent
    ' メソッドの引数にインタフェースの型を指定する
    Service = DirectCast( _
                IContainer.GetComponent(GetType(IS2daotestService), _
                                 "IS2daotestService"), IS2daotestService)

サービス側 : IS2daotestServiceImpl

   以下のDicon定義のArgsを使用してDAOを取得

 (dicon)
  <component name="IS2daotestService"
  class="NtkProjectCore.bl.winapp.s2daotest.impl.IS2daotestServiceImpl">
    <aspect>LocalTx.RequiredTx</aspect>
    <aspect>aop.traceInterceptor</aspect>
    <!-- 担当者マスタDAO(基本) -->
    <arg>dao.INttb01ChargePersonDao</arg>
    <!--コンスタントマスタDAO(基本)-->
    <arg>dao.INttb09ConstantDao</arg>
  </component>

 (dicon/dao)
    <!-- 担当者マスタDao 【基本DAO】-->
    <component name="INttb01ALOZChargePersonDao"
                      class="NtkProjectCore.dao.INttb01ChargePersonDao">
        <aspect>s2dao.Interceptor</aspect>
    </component>
    <!-- コンスタントマスタDao 【基本DAO】-->
    <component name="INttb09ConstantDao"
                          class="NtkProjectCore.dao.INttb09ConstantDao">
        <aspect>s2dao.Interceptor</aspect>
    </component>

s2daotest を実行すると以下のログが出力されます。

INFO  NtkWinProject.s2daotest [(null)] - 処理を開始します
DEBUG Seasar.Framework.Util.DataSourceUtil [(null)]
                  - 論理的なコネクションを取得しました
DEBUG Seasar.Extension.Tx.Impl.TransactionContext [(null)]
                  - トランザクションを開始しました
DEBUG Seasar.Extension.Tx.Impl.TransactionContext [(null)]
                  - トランザクションを開始しました
DEBUG Seasar.Framework.Aop.Interceptors.TraceInterceptor [(null)]
- BEGIN NtkProjectCore.bl.winapp.s2daotest.IS2daotestService
                #GetServicegetALOZChargePersonList()
DEBUG Seasar.Framework.Aop.Interceptors.TraceInterceptor [(null)]
- BEGIN NtkProjectCore.bl.winapp.s2daotest.IS2daotestService
                #GetServicegetALOZChargePersonList()
DEBUG Seasar.Extension.ADO.Impl.BasicSelectHandler [(null)] -
SELECT nttb01ALOZChargePerson.nt01AuthorityLevel, ・・・・・・・・・・・
DEBUG Seasar.Framework.Aop.Interceptors.TraceInterceptor [(null)]
- END NtkProjectCore.bl.winapp.s2daotest.IS2daotestService
#GetServicegetALOZChargePersonList() : System.Collections.ArrayList
DEBUG Seasar.Framework.Aop.Interceptors.TraceInterceptor [(null)]
- END NtkProjectCore.bl.winapp.s2daotest.IS2daotestService
#GetServicegetALOZChargePersonList() : System.Collections.ArrayList
DEBUG Seasar.Extension.Tx.Impl.TransactionContext [(null)]
                  - トランザクションをコミットしました
DEBUG Seasar.Extension.Tx.Impl.TransactionContext [(null)]
                  - トランザクションをコミットしました
DEBUG Seasar.Framework.Util.ConnectionUtil [(null)]
                   - 論理的なコネクションを閉じました
DEBUG NtkWinProject.s2daotest [(null)] - ★★★ 処理します!! ★★★
DEBUG Seasar.Framework.Util.DataSourceUtil [(null)]
                  - 論理的なコネクションを取得しました
DEBUG Seasar.Extension.Tx.Impl.TransactionContext [(null)]
                    - トランザクションを開始しました
Seasar.Extension.Tx.Impl.TransactionContext [(null)]
                    - トランザクションを開始しました
DEBUG Seasar.Framework.Aop.Interceptors.TraceInterceptor [(null)]
- BEGIN NtkProjectCore.bl.winapp.s2daotest.IS2daotestService
                    #GetServiceupdALOZChargePerson(


実行ログを見ると、

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

2.IS2daotestServiceImpl実装クラスで1トランザクションとしたいが、DAOの
 メソッド単位にコネクションの取得→トランザクション・スタート→自動生成
 SQLの実行(または、外部SQLの実行)→トランザクション・コミット→論理コネ
 クションのクローズとなってしまう。
 
 IS2daotestServiceImpl実装クラスでは、条件により、
  ・INttb01ALOZChargePersonDao:Insert/Update
  ・INttb09ConstantDao        :Insert/Update/Delete
 を発行し、処理途中で問題があった場合、テーブルに対する全ての変更をロー
 ルバックしたい。

となっていますが、トランザクションに対する考え方が誤っておりますでしょう
か?

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


長文となり大変恐縮に存じますが、よろしくお願い申し上げます。




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