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

小谷圭 [E-MAIL ADDRESS DELETED]
2007年 6月 27日 (水) 10:18:06 JST


清末様。

小谷と申します。

トランザクションが意図した通りに動かない件ですが、
自分が見る限りではdiconの設定などにおかしな点はないと思います。

付けていただいたログを拝見したところ、
トランザクションの開始、終了の間に「IS2daotestService」メソッドの
処理が行なわれています。
トランザクションに限らずInterceptorはaspectが設定されたメソッド単位で
働くため、動作としてはこれで正しいのではないかと思います。

>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)]
>- トランザクションをコミットしました

その上で、
> IS2daotestServiceImpl実装クラスでは、条件により、
> ・INttb01ALOZChargePersonDao:Insert/Update
> ・INttb09ConstantDao        :Insert/Update/Delete
> を発行し、処理途中で問題があった場合、テーブルに対する全ての変更をロー
> ルバックしたい。

を実装する場合、馬塚さんもおっしゃっている通り、
インターフェースIS2daotestServiceに「問題が起きたらロールバックさせたい一連の処理」を行なう
メソッドを作成し、それを使用するようにすれば、そのメソッドの内容が実行される前に
トランザクションが開始され、実行が終わった後にトランザクションが終了し、
このメソッドの処理中に例外が発生すればロールバックが実行されるかと思います。

------------------------------------------------------
小谷 圭
[E-MAIL ADDRESS DELETED]
------------------------------------------------------

DEBUG Seasar.Framework.Util.ConnectionUtil [(null)]

07/06/26 に KIYOSUE Minoru<[E-MAIL ADDRESS DELETED]> さんは書きました:
> お世話になっております、清末と申します。
>
> 先日、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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


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