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

koyak [E-MAIL ADDRESS DELETED]
2009年 9月 8日 (火) 02:04:46 JST


清末さん

小谷です。

日中は外部につなげない環境にいるため
遅い返信となってしまっています。申し訳ないです。

>TransactionScopeを使用したローカルトランザクションを使用するためには、ODP.NET 10.2.0.3
>が必要でした。
>また、ORACLEインストールDISKのWinVista用には、ODP.NET 10.2.0.3 が入っていないため、
>別途インストールする必要がありました。

そのような罠があるのですね。。。
大変勉強になります。ありがとうございます。

>コネクションの状態などを調べる方法はございますでしょうか?
TransactionScopeが何をやっているのか直接見ることはできないため、
以前のメールで清末さんがなさっていたようにトランザクションの確認は
System.Transaction.Current を取得し、Status,LocalIdentifierをチェックする、
という形になるかと思います。
ただ、DAOだとそれも難しいですね。。。

>falseになるケースにはなにが考えられますでしょうか?
詳細な追跡、ありがとうございます。

・データソースにSeasar.Extension.Tx.TxDataSourceではなく
 Seasar.Extension.ADO.DataSourceImplを使用している

が最も頻度の高いパターンなのではないかと思います。

データソースを複数使用している場合は、トランザクションとSQLの発行で
別のデータソースを見てしまっている場合にも発生することがあります。

>alreadyInTransaction が falseとなってしまう場合があります。
必ずfalseを返すわけではなく、ちゃんとtrueを返し、
正常にロールバックされる場合もあるということでしょうか?
恐縮なのですが、可能であればtrueになるパターン、falseになるパターンを
お知らせいただけたらと思います。


2009年9月7日12:18 KIYOSUE Minoru <[E-MAIL ADDRESS DELETED]>:
> 小谷 様
>
> お手数をお掛けし、大変恐縮に存じます。
> 清末@JMIです。
>
> あれ以降、色々調べました結果を報告申し上げます。
>
>
>> ・ビジネスロジック(Tx.RequiredTx適用?)単独 → ○(ロールバックされる)
>
> そもそも、ロールバックされていると思っていた部分が機能していませんでした。
> (途中のビジネスロジック内のFactoryメソッドで、直接インスタンス化している部分があり、この
> 部分でAOPトランザクションが途切れていました。)
> このため、TransactionScope自体の適用に失敗していました。
>
> TransactionScopeを使用したローカルトランザクションを使用するためには、ODP.NET 10.2.0.3
> が必要でした。
> また、ORACLEインストールDISKのWinVista用には、ODP.NET 10.2.0.3 が入っていないため、
> 別途インストールする必要がありました。
>
> 単純なTransactionScopeを使用し、直接SQLを発行するケースでは、ロールバックされるように
> なりましたが、DAOを使用したUPDATE文では、SQLを発行した時点で、コミットされてしまいます。
>
> コネクションの状態などを調べる方法はございますでしょうか?
>
> また、平行して、LocalTxを使用したパターンに変更しようと思い、AOPを変更いたしましたが、
> 「LocalTxHandler.Handlメソッド」の alreadyInTransaction が falseとなってしまう場合があります。
> AOPは正しく適用されていることは、ステップデバッグで確認いたしました。
> falseになるケースにはなにが考えられますでしょうか?
>
>
> ご多忙中大変恐縮に存じますが、よろしくお願いいたします。
>
> --------------------------------------------------
> From: "koyak" <[E-MAIL ADDRESS DELETED]>
> Sent: Wednesday, September 02, 2009 2:23 AM
> To: <[E-MAIL ADDRESS DELETED]>
> Subject: [seasar-dotnet:1444] Re:System.Transaction TransactionScopeの入れ子について
>
>> 清末さん
>>
>> 小谷です。
>>
>> ・ファサード、ビジネスロジックにTx.RequiredTx → ×(ロールバックされない)
>>
>> ・ファサードにのみTx.RequiredTx → ×
>> ・ビジネスロジック(Tx.RequiredTx適用?)単独 → ○(ロールバックされる)
>>
>>
>> ということは
>> ファサードに対するトランザクションの設定が何か関係している
>> or
>> 一つのトランザクションの中に
>> ビジネスロジックの処理を複数組み合わせると問題が起きる
>>
>> あたりなのかもしれません。
>>
>>> S2Dao.netで接続している場合、ご指摘のようなコネクションの取得がTransactionScopeの
>>> 範囲外となる可能性はあるのでしょうか?
>>
>> コードを見直してみましたが、恐らくないと思われます。
>> (S2DaoInterceptor内で呼ばれるISqlCommand#Executeの中でコネクションをOpenしているので
>> DBを更新しに行くときにコネクションが取得される)
>> 自分で疑わしいと書いておきながら、申し訳ないです。
>>
>>
>> 正直、思いつきで言ってしまっているレベルなのですが、
>> ・ODP.NETの構成
>>
>> http://otndnld.oracle.co.jp/document/products/oracle11g/111/windows/E06104-01/featConfig.htm
>> の分散トランザクション関係の設定
>> なども関係しているかもしれません。
>> (単体でうまくいっているのであればこれも期待薄ですが・・・)
>>
>> 分散トランザクションにこだわる必要がないのであれば、
>> 個人的には五十嵐さんがおっしゃるように
>> LocalTx.RequiredTx
>> http://s2container.net.seasar.org/ja/tx.html#LocalTx
>> を使ったトランザクション管理に切り替えることをオススメしたいのですが、
>> (使われた実績は恐らくこちらの方が多いと思うので)
>> Webサービスで使用されるということなので、
>> 要件によっては難しい事情があるでしょうか。
>>
>> (五十嵐さん、フォローありがとうございます)
>>
>> 後は、全部載せるのは難しいかもしれませんが、
>> 作成されたソースコードやdiconの内容を差し支えのない範囲で
>> お見せいただくと何かわかることがあるかもしれません。
>>
>>
>>
>> 2009年9月1日10:23 五十嵐 大士 <[E-MAIL ADDRESS DELETED]>:
>>>
>>> 小谷さん
>>>
>>> 五十嵐です。
>>>
>>>> >MLの方々へ
>>>> (TransactionScopeに詳しい方や
>>>> 同様の事例を経験なさったことがある方が
>>>> もしいらっしゃいましたらアドバイスお願い致します)
>>>
>>> 以前、
>>> Quill-1.3.11
>>> DBFlute-0.8.0
>>> DB2Express-9.5.2
>>> の環境でTransactionScopeを利用すると例外が発生しました。
>>>
>>> ↓こんなことしたら
>>>      [Test]
>>>      public void Insert()
>>>      {
>>>          using(TransactionScope ts = new TransactionScope())
>>>          {
>>>              Parts parts = new Parts();
>>>              parts.PartsId = "5";
>>>              parts.PartsName = "CPU";
>>>
>>>              partsBehavior.Insert(parts);
>>>          }
>>>      }
>>>
>>> ↓こんな例外でした。
>>> IBM.Data.DB2.DB2Exception: 0ERROR [58005] [IBM][DB2/NT] SQL0998N
>>>  トランザクションまたはヒューリスティック処理中に、エラーが発生しました。理由コード = "16"。サブコード = "2-8004D026"。
>>> SQLSTATE=58005
>>> 場所 IBM.Data.DB2.DB2ConnPool.a(DB2Connection A_0, String A_1, ref a A_2,
>>> ref Object A_3)
>>> 場所 IBM.Data.DB2.DB2Connection.Open()
>>> 場所 Seasar.Framework.Util.DataSourceUtil.GetConnection(IDataSource
>>> dataSource) 場所 DataSourceUtil.cs: line 42
>>>
>>> これはDB2に固執した内容だと思いますし、ちょっと違う事象だと思いますが
>>> 一応報告いたします。
>>>
>>> # これがあって小谷さんにTransaction管理インタセプタで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 メーリングリストの案内