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

KIYOSUE Minoru [E-MAIL ADDRESS DELETED]
2009年 9月 7日 (月) 12:18:18 JST


小谷 様

お手数をお掛けし、大変恐縮に存じます。
清末@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 メーリングリストの案内