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

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2010年 7月 8日 (木) 13:45:56 JST


小谷さん

ナガイシです。

修正ありがとうございます。

メーリングリストのメールアドレスを変更した為
スレッドが切れた場合は申し訳ありません。

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