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