[seasar-dotnet:1767] Re: メソッド単位にかけたトランザクションがクラス全体にかかる

koyak [E-MAIL ADDRESS DELETED]
2010年 7月 7日 (水) 06:42:17 JST


ナガイシさん

小谷です。

ご確認ありがとうございます。
こちらの環境でも問題が再現しました。

修正方法を考えてみようと思います。

2010年7月6日21:59 kircheis <[E-MAIL ADDRESS DELETED]>:
> 小谷さん ご返信ありがとうございます。
> 回答が遅れてすみません。
>
> 最初にログの件ですが
> SampleBusinessLogicImplクラスのDataInsertメソッドにのみ
> Transaction属性を付加し、DataInsertメソッドを実行した場合のログです。
> DEBUG 2010-07-06 14:00:30,225 [4] 論理的なコネクションを取得しました
> DEBUG 2010-07-06 14:00:30,225 [4] トランザクションを開始しました
> DEBUG 2010-07-06 14:00:30,225 [4] INSERT INTO M_TEST (BIKO, SEQID,
> BIRTH, NAME) VALUES ('aaaaa', ' ', '2010-07-06 14.00.19', 'bb')
> DEBUG 2010-07-06 14:00:30,240 [4] トランザクションをロールバックしました
> DEBUG 2010-07-06 14:00:30,240 [4] 論理的なコネクションを閉じました
>
> 次にDataInsertメソッドにのみTransaction属性を付加し
> 付加していないSampleBusinessLogicImplクラスのDataUpdateメソッドを
> 実行した場合のログです。
> DEBUG 2010-07-06 14:01:45,365 [4] 論理的なコネクションを取得しました
> DEBUG 2010-07-06 14:01:45,365 [4] トランザクションを開始しました
> DEBUG 2010-07-06 14:01:45,365 [4] UPDATE M_TEST SET BIKO = 'aaaaaa',
> BIRTH = '2010-07-06 14.01.38', NAME = 'bbbbb WHERE SEQID = '9 '
> DEBUG 2010-07-06 14:01:45,381 [4] トランザクションをコミットしました
> DEBUG 2010-07-06 14:01:45,381 [4] 論理的なコネクションを閉じました
>
> Transaction属性を全く付加しない場合のDataInsertメソッドのログは以下の通
> りです。
> DEBUG 2010-07-06 14:03:27,365 [4] 論理的なコネクションを取得しました
> DEBUG 2010-07-06 14:03:27,381 [4] 論理的なコネクションを閉じました
> DEBUG 2010-07-06 14:03:27,428 [4] INSERT INTO M_TEST (BIKO, SEQID,
> BIRTH, NAME) VALUES (aaaaa', '9 ', '2010-07-06 14.01.38', 'bbbbb')
> DEBUG 2010-07-06 14:03:27,428 [4] 論理的なコネクションを取得しました
> DEBUG 2010-07-06 14:03:27,443 [4] 論理的なコネクションを閉じました
>
> 上記のログはSampleBusinessLogicImplクラスのメソッドに
> Transaction属性を付加した場合です。
> SampleBusinessLogicImplクラスに対してTransaction属性を
> 付加した場合、当然トランザクションは実行されます。
>
> また、ISampleBusinessLogicインターフェースのDataInsertメソッドや
> IM_TESTdaoインターフェースのInsertDataメソッドにTransaction属性を
> 付加してもトランザクションが実行されませんでした。
>
>
>
> 2番目のWebサービスを介さない場合ですが
> (1)Windows Form (SampleFormクラス)
>> (3)BusinessLogic (SampleBusinessLogicImplクラス
>   (←ISampleBusinessLogicインターフェース)) ※トランザクション属性
>> (4)DAO Interface (IM_TESTdaoインターフェース)
> の構成でもWebサービス経由と同様の結果でした。
>
> 何かお気づきの点があれば、ご返信をお願いいたします。
>
>
>
> (2010/07/06 7:27)
>> 連投失礼します。
>>
>> ナガイシさん
>>
>> 小谷です。
>>
>> Webサービスを介さなかった場合も同様の結果になるでしょうか?
>> 念のため試してみていただけないでしょうか。
>>
>> (1)Windows Form (SampleFormクラス)
>>>> (3)BusinessLogic (SampleBusinessLogicImplクラス(←ISampleBusinessLogicイ
>> ンターフェース)) ※トランザクション属性
>>>> (4)DAO Interface (IM_TESTdaoインターフェース)
>>
>> 2010年7月6日6:59 koyak <[E-MAIL ADDRESS DELETED]>:
>>
>>> ナガイシさん
>>>
>>> 小谷です。
>>>
>>> ソースコードを拝見致しましたが、
>>> メソッドへのトランザクション設定として、
>>> 特に問題はないように思えます。
>>>
>>> 参考までに、ログがありましたら差し支えなければそちらも
>>> 見せていただけないでしょうか。
>>>
>>> 2010年7月6日0:34 kircheis <[E-MAIL ADDRESS DELETED]>:
>>>
>>>> はじめまして、ナガイシと申します。
>>>>
>>>> 今、以下の環境でQuill + S2Dao.Netでスマートクライアント開発を
>>>> 行うべく、サンプルを作成しています。
>>>>
>>>> 開発環境
>>>> Windows XP SP3
>>>> VisualBasic 2008 (.Net Framework3.5)
>>>> S2Container.Net 1.3.17 (Quill)
>>>> Oracle11.2.0.1
>>>> ODP.NET 2.112.1.0
>>>>
>>>> サンプル構成
>>>> (1)Windows Form (SampleFormクラス)
>>>>>>>> (2)ASP.NET XML Service (SampleWebServiceクラス)
>>>>>>>> (3)BusinessLogic (SampleBusinessLogicImplクラス(←ISampleBusinessLogicイ
>>>> ンターフェース)) ※トランザクション属性
>>>>>>>> (4)DAO Interface (IM_TESTdaoインターフェース)
>>>>
>>>> BusinessLogicにDataInsert、DataUpdate、DataDeleteメソッドを作成し
>>>> 各メソッドにTransaction属性をつけてメソッド単位のトランザクション処理を
>>>> 行うべく作成を行いました。
>>>> 各メソッドのコミット、ロールバックは正常に行われるのですが
>>>> 例えば、DataInsertメソッドにのみTransaction属性を付加しても
>>>> Transaction属性をつけていないDataUpdate、DataDeleteメソッドで
>>>> コミット、ロールバックが発生してしまいます。
>>>> (クラス全体にTransaction属性はなく、DaoにもTransaction属性はありません)
>>>>
>>>> DataInsertメソッドの流れの概略は以下の通りです。
>>>> (1)より(2).DataInsertメソッドを呼出
>>>>>>>> (2).DataInsertメソッドより(3)のDataInsertメソッドを呼出
>>>>>>>> (3).DataInsertメソッドは(4)のInsertDataメソッドを呼出
>>>>
>>>>
>>>> 下記ソースの
>>>> <<BusinessLogic>>
>>>> →※クラス
>>>> →Public Class SampleBusinessLogicImpl
>>>> →<Transaction()>
>>>> Public Overridable Function DataInsert(ByVal entity As M_TESTentity) 〜
>>>> がTransaction属性の部分です。
>>>>
>>>>
>>>> 今回がスマートクライアントもSeasar.Netも初めてで
>>>> 色々調べてみましたが、トランザクションがかからない現象は
>>>> よく見かけるのですが、トランザクションの範囲が想定以上に
>>>> なる現象は発見できませんでした。
>>>>
>>>> 下記にソースを記載しております。
>>>> ソースが長く申し訳ありませんが
>>>> 何かお気づきの事があればご助言頂きたいと考えております。
>>>> よろしくお願いいたします。
>>>>
>>>>
>>>>
>>>>
>>>> <<Windows Form>>
>>>> Public Class SampleForm
>>>>
>>>> Private Sub btnExec_Click(ByVal sender As System.Object, ByVal e As
>>>> System.EventArgs) Handles btnExec.Click
>>>>
>>>> Dim _SampleWebService As New SampleWebService.SampleWebService
>>>> Dim _entity As New SampleWebService.M_TESTentity
>>>> Dim _entityList() As SampleWebService.M_TESTentity
>>>>
>>>> With _entity
>>>> .Seqid = txtID.Text
>>>> .Name = txtNAME.Text
>>>> .Birth = CDate(dtpBirth.Value)
>>>> .Biko = txtBIKO.Text
>>>> End With
>>>>
>>>> Select Case True
>>>> Case rdoInsert.Checked
>>>> If _SampleWebService.DataInsert(_entity) Then
>>>> MessageBox.Show("正常")
>>>> Else
>>>> MessageBox.Show("異常")
>>>> End If
>>>> Case rdoUpdate.Checked
>>>> If _SampleWebService.DataUpdate(_entity) Then
>>>> MessageBox.Show("正常")
>>>> Else
>>>> MessageBox.Show("異常")
>>>> End If
>>>> Case rdoDelete.Checked
>>>> If _SampleWebService.DataDelete(_entity) Then
>>>> MessageBox.Show("正常")
>>>> Else
>>>> MessageBox.Show("異常")
>>>> End If
>>>> End Select
>>>> End Sub
>>>>
>>>> <<Web Service>>
>>>> <System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
>>>> <System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)>
>>>> _
>>>> <ToolboxItem(False)> _
>>>> Public Class SampleWebService
>>>> Inherits System.Web.Services.WebService
>>>>
>>>> Protected injector As QuillInjector = QuillInjector.GetInstance
>>>> Protected SampleClass As ISampleBusinessLogic
>>>>
>>>> Public Sub New()
>>>> injector.Inject(Me)
>>>> End Sub
>>>>
>>>> <WebMethod()> _
>>>> Public Function DataInsert(ByVal entity As M_TESTentity) As Boolean
>>>> Return SampleClass.DataInsert(entity)
>>>> End Function
>>>>
>>>> <WebMethod()> _
>>>> Public Function DataUpdate(ByVal entity As M_TESTentity) As Boolean
>>>> Return SampleClass.DataUpdate(entity)
>>>> End Function
>>>>
>>>> <WebMethod()> _
>>>> Public Function DataDelete(ByVal entity As M_TESTentity) As Boolean
>>>> Return SampleClass.DataDelete(entity)
>>>> End Function
>>>> End Class
>>>>
>>>>
>>>> <<Web.config>>
>>>> <quill>
>>>> <dataSources>
>>>> <dataSource name="ds">
>>>> <provider>ODP</provider>
>>>> <connectionString>"Data Source=ORA_SAMPLE;User
>>>> ID=sampleuser;Password=samplepwd"</connectionString>
>>>> <class>Seasar.Extension.Tx.Impl.TxDataSource</class>
>>>> </dataSource>
>>>> </dataSources>
>>>>
>>>> <assemblys>
>>>> <assembly>Seasar</assembly>
>>>> <assembly>Seasar.Dao</assembly>
>>>> <!-- Oracle Data Provider for .NET を使用する場合に必要です。 -->
>>>> <assembly>Oracle.DataAccess, version=2.112.1.0, Culture=neutral,
>>>> PublicKeyToken=89b483f429c47342</assembly>
>>>> <!--<assembly>SampleBusinessLogic</assembly>-->
>>>> </assemblys>
>>>> </quill>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> <<BusinessLogic>>
>>>> ※インターフェース
>>>> <Implementation(GetType(SampleBusinessLogicImpl))> _
>>>> Public Interface ISampleBusinessLogic
>>>> Function DataInsert(ByVal entity As M_TESTentity) As Boolean
>>>> Function DataUpdate(ByVal entity As M_TESTentity) As Boolean
>>>> Function DataDelete(ByVal entity As M_TESTentity) As Boolean
>>>> End Interface
>>>>
>>>> ※クラス
>>>> Public Class SampleBusinessLogicImpl
>>>> Implements ISampleBusinessLogic
>>>>
>>>> Protected daoObject As IM_TESTdao
>>>> <Transaction()>
>>>> Public Overridable Function DataInsert(ByVal entity As M_TESTentity) As
>>>> Boolean Implements ISampleBusinessLogic.DataInsert
>>>> Dim intResult As Integer
>>>> intResult = daoObject.InsertData(entity)
>>>> Return True
>>>> End Function
>>>>
>>>> Public Function DataUpdate(ByVal entity As M_TESTentity) As Boolean
>>>> Implements ISampleBusinessLogic.DataUpdate
>>>> Dim intResult As Integer
>>>> intResult = daoObject.UpdateData(entity)
>>>> Return True
>>>> End Function
>>>>
>>>> Public Function DataDelete(ByVal entity As M_TESTentity) As Boolean
>>>> Implements ISampleBusinessLogic.DataDelete
>>>> Dim intResult As Integer
>>>> intResult = daoObject.DeleteData(entity)
>>>> Return True
>>>> End Function
>>>> End Class
>>>>
>>>>
>>>> <<Dao Interface>>
>>>> ※インターフェース
>>>> <Implementation()> _
>>>> <S2Dao()> _
>>>> <Bean(GetType(M_TESTentity))> _
>>>> Public Interface IM_TESTdao
>>>> Inherits AbstractBaseDao
>>>>
>>>> Function InsertData(ByVal data As M_TESTentity) As Integer
>>>> Function UpdateData(ByVal data As M_TESTentity) As Integer
>>>> Function DeleteData(ByVal data As M_TESTentity) As Integer
>>>> End Interface
>>>>
>>>> ※エンティティクラス
>>>> <Table("M_TEST")> _
>>>> Public Class M_TESTentity
>>>> Inherits AbstractBaseEntity
>>>>
>>>> Private _seqid As String
>>>> Private _name As String
>>>> Private _birth As Nullable(Of Date)
>>>> Private _biko As String
>>>>
>>>> Public Sub New()
>>>> _seqid = ""
>>>> _name = ""
>>>> _biko = ""
>>>> End Sub
>>>>
>>>> <Column("SEQID")> _
>>>> Public Property Seqid() As String
>>>> Get
>>>> Return _seqid.PadRight(5, " ") 'PrimaryKeyがChar型の場合、桁数に合わせて
>>>> 空白を付加しないと自動作成SQLと連動できない
>>>> End Get
>>>> Set(ByVal value As String)
>>>> _seqid = value
>>>> End Set
>>>> End Property
>>>>
>>>> <Column("NAME")> _
>>>> Public Property Name() As String
>>>> Get
>>>> Return _name
>>>> End Get
>>>> Set(ByVal value As String)
>>>> _name = value
>>>> End Set
>>>> End Property
>>>>
>>>> <Column("BIRTH")> _
>>>> Public Property Birth() As Date
>>>> Get
>>>> Return _birth
>>>> End Get
>>>> Set(ByVal value As Date)
>>>> _birth = value
>>>> End Set
>>>> End Property
>>>>
>>>> <Column("BIKO")> _
>>>> Public Property Biko() As String
>>>> Get
>>>> Return _biko
>>>> End Get
>>>> Set(ByVal value As String)
>>>> _biko = value
>>>> End Set
>>>> End Property
>>>>
>>>> End Class
>>>>
>>>> _______________________________________________
>>>> 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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


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