[seasar-dotnet:509] Re: 自動生成 Insert、Update、Delete文のトランザクションが効かない

Hiroaki Fujii [E-MAIL ADDRESS DELETED]
2007年 6月 16日 (土) 02:47:21 JST


コミッタの藤井です。

IS2daotestServiceインターフェイスのメソッドがどうなっているかよく
分かりませんが、無ければ作っていただいて、そのメソッドに対して、
トランザクションをかけてみてください。
そうすれば、そのメソッドを実行中トランザクションがかかります。

例えば、IS2daotestServiceにInsertメソッドがあるとして、
diconファイルの中で
<component
class="NtkProjectCore.bl.winapp.s2daotest.impl.IS2daotestServiceImpl">
    <aspect pointcut="Insert">Ex.LocalRequiredTx</aspect>
</component>
という感じで記述します。
私は、Propertyインジェクションを使うので、diconファイルの記述量が
少ないですが。

よければ、WindowsFormのサンプルを見ていただくと参考になるかも
しれません。

KIYOSUE Minoru さんは書きました:
> いつもお世話になっております、清末と申します。
> 
> 先日、S2Dao.dllがロードされない件は無事解消し、実装を進めておりましたが、
> 今度は、自動生成のSQL(Insert/Update/Delete)で、トランザクションが効かな
> い状況となってしまいました。
> 
> ----- ado.diconの定義 --------->>
> <components namespace="ado">
> 
>   <!--  
> ====================================================================== -->
>   <!-- .NET Framework Data Provider for SQL Server を使用する場合に必要です。 
>  -->
>   <!--  
> ====================================================================== -->
> 
>   <component name="SqlClient" class="Seasar.Extension.ADO.DataProvider">
>     <property 
> name="ConnectionType">"System.Data.SqlClient.SqlConnection"</property>
>     <property 
> name="CommandType">"System.Data.SqlClient.SqlCommand"</property>
>     <property 
> name="ParameterType">"System.Data.SqlClient.SqlParameter"</property>
>     <property 
> name="DataAdapterType">"System.Data.SqlClient.SqlDataAdapter"</property>
>   </component>
>   <component name="DataSource" 
> class="Seasar.Extension.Tx.Impl.TxDataSource">
>     <property name="DataProvider">SqlClient</property>
>     <property 
> name="ConnectionString">"Server=naga\\SQLEXPRESS;database=NTKDB;Integrated 
> Security=SSPI"</property>
>   </component>
> 
>   <!-- ローカルトランザクション用のインターセプターで使用します。 -->
>   <component class="Seasar.Extension.Tx.Impl.TransactionContext" />
> 
> </components>
> 
> ----- ado.diconの定義 ---------<<
> 
> ----- Tx.diconの定義 --------->>
> 
> <components namespace="Tx">
>   <include path="dicon/ado.dicon" />
> 
>   <component name="TransactionStateHandler" 
> class="Seasar.Extension.Tx.Impl.TransactionStateHandler" />
> 
>   <component name="RequiredTx" 
> class="Seasar.Extension.Tx.TransactionInterceptor">
>     <arg><component class="Seasar.Extension.Tx.Impl.RequiredTxHandler" 
> /></arg>
>   </component>
> 
> </components>
> 
> 
> ----- Tx.diconの定義 ---------<<
> 
> 利用しているDiconの定義
> 
>   <include path="dicon/aop.dicon"     />
>   <include path="dicon/ado.dicon"     />
>   <include path="dicon/s2dao.dicon"   />
>   <include path="dicon/dao.dicon"     />
>   <include path="dicon/daoex.dicon"   />
>   <include path="dicon/LocalTx.dicon" />
>   <include path="dicon/Tx.dicon"      />
> 
>   <!--  
> ===================================================================== -->
>   <!--                           s2daotestサービ -->
>   <!--  
> ===================================================================== -->
>   <component name="IS2daotestService"
>             class="NtkProjectCore.bl.winapp.s2daotest.impl.IS2daotestServiceImpl">
>     <aspect>Tx.RequiredTx</aspect>
>     <aspect>aop.traceInterceptor</aspect>
>     <!-- 担当者マスタDAO(基本) -->
>     <arg>dao.INttb01ChargePersonDao</arg>
>     <!--コンスタントマスタDAO(基本)-->
>     <arg>dao.INttb09ConstantDao</arg>
>   </component>
> 
> Daoの定義
> 
>     <Bean(GetType(Nttb09ConstantEntity))> _
>     Public Interface INttb09ConstantDao
> 
>         ''' <summary>
>         '''    INSERT
>         ''' </summary>
>         ''' <param name="vo">バリューオブジェクト。 </param>
>         ''' <returns> 処理対象件数。 </returns>
>         Function Insert(ByVal vo As Nttb09ConstantEntity) As Integer
> 
>         ''' <summary>
>         '''    UPDATE
>         ''' </summary>
>         ''' <param name="vo">バリューオブジェクト。 </param>
>         ''' <returns> 処理対象件数。 </returns>
>         Function Update(ByVal vo As Nttb09ConstantEntity) As Integer
> 
>         ''' <summary>
>         '''    DELETE
>         ''' </summary>
>         ''' <param name="vo">バリューオブジェクト。 </param>
>         ''' <returns> 処理対象件数。 </returns>
>         Function delete(ByVal vo As Nttb09ConstantEntity) As Integer
> 
> 
> s2daotestサービス 側での実行
> 
>             For Each objEntity In list
> 
>                                  ~~~~ *1
>                 Dim intCount As Integer
> 
>                 intCount = _Nttb09ConstantDao.Insert(objEntity)
>        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *2
> 
>                 If intCount <> 1 Then
>                     'エラー
>                     strMsgID = "EEE"
>                 End If
>                 intRtnCount += intCount
>             Next
> 
> テストで、list(*1)に同じプライマリ・キー値を持つEntityをセットし、呼び出しております。
> 2重登録エラーが *2 で発生しますが、1件目は登録されてしまいます。
> 
> トランザクションが効いていれば、1件目もロールバックされるものと思いますが
> 何の指定に誤りがあるのでしょうか。
> 
> また、トランザクションの状態を知る方法(トランザクションがスタートしているかなど)が
> ございますでしょうか。
> 
> 長文になり大変申し訳ございません。
> どうぞご教授下さいますようお願い申し上げます。
> 
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> 



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