[seasar-dotnet:1441] Re: System.Transaction TransactionScopeの入れ子について

KIYOSUE Minoru [E-MAIL ADDRESS DELETED]
2009年 9月 1日 (火) 08:13:38 JST


小谷 様

お手数をお掛けし大変恐縮に存じます、清末@JMIです。

> 「こちらの方でもTx.RequiredTx(RequiredTxHandler)を使ってINSERT文を発行
> →挿入されたことを確認後わざと例外発生
> させてみたのですが正常にロールバックされていました。
> (SQLServer2005 ExpressEditionを使用)」

入れ子になっている、クラスの各メソッドを単独でテストした場合は、更新/ロールバック 

されています。


>> ・コネクションの取得をTransactionScopeの外で行っている
>> (この場合、更新処理がトランザクションに参加していない状態になるので
>> ロールバックされません)

S2Dao.netとODP.netを使用しています。
ODP.net自体は、単体でクラスのテストをした場合正常に機能しているので、問題が
あるとは思えないです。

S2Dao.netで接続している場合、ご指摘のようなコネクションの取得がTransactionScopeの
範囲外となる可能性はあるのでしょうか?

また、自力で接続を確保する方法はありますか?

メソッドにトランザクションをAOPしない場合のトランザクションは何が適応されますか?

質問ばかりで大変申し訳ございませんが、よろしくお願いいたします。


--------------------------------------------------
From: "koyak" <[E-MAIL ADDRESS DELETED]>
Sent: Tuesday, September 01, 2009 2:15 AM
To: <[E-MAIL ADDRESS DELETED]>
Subject: [seasar-dotnet:1440] Re:System.Transaction TransactionScopeの入れ子について

> 小谷です。
>
> 連続投稿申し訳ありません。
>
>>こちらの方でもTx.RequiredTx(RequiredTxHandler)を使ってINSERT文を
>>発行してみたのですが正常に更新されていました。
>>(SQLServer2005 ExpressEditionを使用)
>
> 「こちらの方でもTx.RequiredTx(RequiredTxHandler)を使ってINSERT文を発行
> →挿入されたことを確認後わざと例外発生
> させてみたのですが正常にロールバックされていました。
> (SQLServer2005 ExpressEditionを使用)」
>
> に訂正させて下さい。
> 失礼致しました。
>
> 2009年9月1日2:12 koyak <[E-MAIL ADDRESS DELETED]>:
>> 清末さん
>>
>> 小谷です。
>>
>>> メソッドにトランザクションをAOPしない場合のトランザクションは何が適応されますか?
>> 入れ子にする/しないが結果に関わるのか
>> 確認しておいた方がいいかと思い、念のため確認させていただきました。
>> 入れ子かどうかは関係なさそうですね。
>>
>> こちらの方でもTx.RequiredTx(RequiredTxHandler)を使ってINSERT文を
>> 発行してみたのですが正常に更新されていました。
>> (SQLServer2005 ExpressEditionを使用)
>>
>> 他に(私が思いつく範囲で)考えられそうなのは
>> ・コネクションの取得をTransactionScopeの外で行っている
>> (この場合、更新処理がトランザクションに参加していない状態になるので
>> ロールバックされません)
>> ・DBドライバの問題?(TransactionScopeに対応していないようなDBを使っている) 
>> 
>> あたりでしょうか。
>>
>> 後者はさすがにないと思うので
>> 前者については問題ないかどうかご確認いただけないでしょうか。
>>
>> >MLの方々へ
>> (TransactionScopeに詳しい方や
>> 同様の事例を経験なさったことがある方が
>> もしいらっしゃいましたらアドバイスお願い致します)
>>
>>
>> 2009年8月31日3:50 KIYOSUE Minoru <[E-MAIL ADDRESS DELETED]>:
>>> 小谷 様
>>>
>>> お世話になります、清末@JMIです。
>>>
>>> 以下、インラインでご質問に回答申し上げます。
>>>
>>>>> 2の各メソッドにも同様に、<asspect pointcut="MethodB1">のように指定しています。
>>>>
>>>> この2の各メソッドにTransactionInterceptorを適用しない場合
>>>> (aspectの指定をせず、入れ子にしない場合)も
>>>> 同様にロールバックされないでしょうか?
>>>
>>> ロールバックされませんでした。
>>> メソッドにトランザクションをAOPしない場合のトランザクションは何が適応されますか?
>>>
>>>> また、ファサードのメソッドを抜けた後、ログの方には
>>>> 「トランザクションをコミットしました」と出ていたでしょうか。
>>>> 「トランザクションをロールバックしました」と出ていたでしょうか。
>>>
>>> ファサードのメソッド内で強制的にExceptionを発生させテストしております。
>>> このため、ログには
>>>
>>> Seasar.Extension.Tx.Impl.RequiredTxHandler [(null)] - トランザクションをロールバックしました
>>>
>>> が表示されています。
>>>
>>> また、RequiredTxHandler内で、System.Transaction.Current
>>> を取得し、Status,LocalIdentifier
>>> 等を確認いたしましたが、AOPでトランザクションを適用している場合は、同じトランザクションを
>>> 使用しています。
>>>
>>>
>>> お手数をお掛けし大変恐縮に存じますが、よろしくお願い申し上げます。
>>>
>>>
>>> --------------------------------------------------
>>> From: "koyak" <[E-MAIL ADDRESS DELETED]>
>>> Sent: Sunday, August 30, 2009 12:05 PM
>>> To: <[E-MAIL ADDRESS DELETED]>
>>> Subject: [seasar-dotnet:1437] Re:System.Transaction TransactionScopeの入れ子について
>>>
>>>> 清末さん
>>>>
>>>> 小谷と申します。
>>>>
>>>> TransactonScopeについてあまり詳しくはないため
>>>> 回答ではなく質問を返す形になってしまい、恐縮なのですが、
>>>>
>>>>> 2の各メソッドにも同様に、<asspect pointcut="MethodB1">のように指定しています。
>>>>
>>>> この2の各メソッドにTransactionInterceptorを適用しない場合
>>>> (aspectの指定をせず、入れ子にしない場合)も
>>>> 同様にロールバックされないでしょうか?
>>>>
>>>> また、ファサードのメソッドを抜けた後、ログの方には
>>>> 「トランザクションをコミットしました」と出ていたでしょうか。
>>>> 「トランザクションをロールバックしました」と出ていたでしょうか。
>>>>
>>>>
>>>> 2009年8月29日14:15 KIYOSUE Minoru <[E-MAIL ADDRESS DELETED]>:
>>>>>
>>>>> いつも大変お世話になっております、清末@JMIです。
>>>>> 先ほど、メーリングリスト登録外のアドレスから誤って送信してしまい大変申し訳ござい
>>>>> ません。 再度投稿いたしますのでよろしくお願いいたします。
>>>>>
>>>>> 今回、ウェブサービスの構築をしております。
>>>>> その中で、Tx.RequiredTxトランザクションを使用したトランザクション制御を以下の用に
>>>>> 行おうとしておりますが、設定が悪いためかトランザクションが効きません。
>>>>>
>>>>> 1.ファサード層のメソッドにトランザクションを設定、
>>>>> 2.ファサード層から、GetComponent()を使用して、ビジネスロジック層のクラスを
>>>>> 呼び出す。
>>>>> 3.2を必要なだけクラスを変えて呼び出す。
>>>>> 4.3が全て正常終了の場合は、コミットがかかる用にする。
>>>>> (TransactionScopeを使用しているため、1つでもComplete()を通過していなければ
>>>>> ロールバックされると思うのですが。)
>>>>>
>>>>>
>>>>> 1のファサード層のメソッドには、DICONで、<aspect pointcut="MethodA">のように
>>>>> 指定しています。
>>>>> 2の各メソッドにも同様に、<asspect pointcut="MethodB1">のように指定しています。
>>>>>
>>>>>
>>>>> 実行時のログを見ると、「トランザクションを開始しました」のメッセージが出力されて
>>>>> います。
>>>>>
>>>>>
>>>>> しかしながら、何個目かの2のメソッドで例外が発生しても、その前に実行したメソッド
>>>>> のDB更新がロールバックされません。
>>>>> TransactionScopeを使用している場合、メソッド内から他のメソッドを呼び出し、その
>>>>> 中にTransactionScopeがあれば、自動で入れ子になると思うのですが、AOPでトラン
>>>>> ザクションを取り込んだ場合には、入れ子にできないのでしょうか?
>>>>>
>>>>> ご多忙中大変恐縮に存じますが、入れ子にする方法があればご教示ください。
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> 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 メーリングリストの案内