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

koyak [E-MAIL ADDRESS DELETED]
2010年 7月 9日 (金) 07:00:40 JST


ナガイシさん

小谷です。

もしVisualStudioでC#もコンパイル可能な環境でしたら
https://www.seasar.org/svn/s2container.net/trunk/s2container.net/
からsuversionでソースコードを取得し、
コンパイルして他のseasar.net系のdllも一緒に
置き換えてみていただけないでしょうか。
(Seasar.Quillのbinフォルダの中にコンパイルした
dll等が出力されているはずです)


2010年7月8日13:45  <[E-MAIL ADDRESS DELETED]>:
> 小谷さん
>
> ナガイシです。
>
> 修正ありがとうございます。
>
> メーリングリストのメールアドレスを変更した為
> スレッドが切れた場合は申し訳ありません。
>
> 投稿元:[seasar-dotnet:1760]メソッド単位にかけたトランザクションがクラス全体にかかる
>
>
> 修正DLLをダウンロードし、置き換えて実行したのですが
> 以下のエラーが発生しました。
>
> Web ServiceのWeb.Configの<quill>タグのところで以下のエラーが
> 出ているようです。
>
> DEBUG 2010-07-08 13:36:17,918 [10] System.Web.Services.Protocols.SoapException:
>  System.Web.Services.Protocols.SoapException: サーバーは要求を処理できませんでした。
>  ---> System.Configuration.ConfigurationErrorsException:
> quill のための構成セクション ハンドラを作成中にエラーが発生しました。:
>  アセンブリ 'Seasar, Version=1.3.17.0, Culture=neutral, PublicKeyToken=1d0d0c484d50ca62' から
> 型 'Seasar.Framework.Util.ConfigSectionUtil' を読み込めませんでした。
>  (D:\Program Files\Source\SampleSmartClient\SampleSmartClient\SampleWebService\web.config line 142)
> ---> System.TypeLoadException:
>  アセンブリ 'Seasar, Version=1.3.17.0, Culture=neutral, PublicKeyToken=1d0d0c484d50ca62' から
> 型 'Seasar.Framework.Util.ConfigSectionUtil' を読み込めませんでした。
>
> DLLを元に戻すと上記のエラーは発生しませんでした。
>
> 何かお気づきの点があれば、ご返信をお願いいたします。
>
>
>
>
>>ナガイシさん
>>
>>小谷です。
>>
>>ソースコードを修正しました。
>>
>>VB.NETをお使いとのことなので
>>https://www.seasar.org/svn/s2container.net/trunk/s2container.net/seasar_dotnet1760
>>にコンパイル済の修正DLLを一時的に置きました。
>>
>>お使いのSeasar.Quill.dllをこのDLLに置き換えて
>>問題が修正されているか(Transaction属性を指定したメソッドにのみ
>>トランザクションが適用されているか)ご確認いただけないでしょうか。
>>
>>2010年7月7日6:42 koyak <[E-MAIL ADDRESS DELETED]>:
>> ナガイシさん
>>
>> 小谷です。
>>
>> ご確認ありがとうございます。
>> こちらの環境でも問題が再現しました。
>>
>> 修正方法を考えてみようと思います。
>>
>> 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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


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