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

KIYOSUE Minoru [E-MAIL ADDRESS DELETED]
2007年 6月 28日 (木) 10:13:50 JST


小谷様、早々のご回答大変ありがとうございます。

馬塚様、小谷様様のご指摘に基づき、今一度処理を見直し、処理を以下の様に
変更いたしました。



呼出元;

 service.exec(ilist処理したいデータ)

サービス側

リストにデータが存在するだけ  {

  ・INttb01ALOZChargePersonDao:Insert/Update
  ・INttb09ConstantDao        :Insert/Update/Delete

}

サービス側のExecに対しTranを指定。

全てのケースでまだ検証は取っていないのですが、上記の変更で
上手く行きそうです。


どうも、今回の開発に携わっているメンバー全員が勘違いしていました。
Serviceに対し、トランザクションを指定しているので、その中のDao呼
出しに対し一環したトランザクションが使用されると思っておりました
ので表題のような質問をさせていただきました。

しかしながら、良く考えれば、Serviceに対しトランザクションを設定
しているので、Serviceのメソッドを呼出す都度、

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

となる訳ですよね。

呼び出しもとにトランザクションを設定するならまた別になるのかと思いますが
都合良く勝手に解釈していたようです。

馬塚様、小谷様様のご回答で、早々に解決する事ができました。
大変ありがとうございました。



----- Original Message ----- 
From: "小谷圭" <[E-MAIL ADDRESS DELETED]>
To: <[E-MAIL ADDRESS DELETED]>
Sent: Wednesday, June 27, 2007 10:18 AM
Subject: [seasar-dotnet:519] Re:複数テーブルのDaoで自動生成した Insert、
Update、Delete文のトランザクション制御


> 清末様。
>
> 小谷と申します。
>
> トランザクションが意図した通りに動かない件ですが、
> 自分が見る限りでは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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>



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