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

kircheis [E-MAIL ADDRESS DELETED]
2010年 7月 6日 (火) 21:59:38 JST


小谷さん ご返信ありがとうございます。
回答が遅れてすみません。

最初にログの件ですが
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 メーリングリストの案内