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

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2010年 7月 9日 (金) 20:06:49 JST


小谷さん

ナガイシです。

ご返信ありがとうございます。

結果から話しますと
メソッド単位のトランザクションできるように
なりました。

下記の手順でDLLを置き換えてうまくできました。

修正して頂き、ありがとうございました。


また質問で申しわけありませんが
オープンソースの利用が初めてでよく分かっていないのですが
今回の修正分はどのように提供されるのでしょうか?

今回ご提供頂いたソースは現在、Seasar.NetのHPから
入手できる1.3.17とは別もの?なると思います。

例えば、今回の修正内容は1.3.18や
1.3.17のパッチ版などでHPでDLL等含めて提供されるのか
など、今後の動き・反映の段取りはどうなるのでしょうか?

このあたりの分かるHPや資料などありましたら
入手方法を教えて頂ければありがたいのです。

ご指摘等ございましたら、ご返信をお願い致します。



>ナガイシさん
>
>小谷です。
>
>もし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 mailing list
>[E-MAIL ADDRESS DELETED]
>https://ml.seasar.org/mailman/listinfo/seasar-dotnet


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