2009-06-18 10 views
3

「分散トランザクションに参加できません」というメッセージが表示され、Oracleに例外がスローされるユニットテストで問題が発生しています。私たちはODP.netとNHibernateを使用しています。この問題は、ネストされたトランザクション内でデータベースに一定数のコミットを行った後に発生します。うーん、これは、継続的な統合サーバー(Windows Server 2003 R2 SP1)ではなく、私の開発マシン(XP SP2)で失敗しています。NHibernateとの分散トランザクションに参加できません

これは、問題の(っぽい)小さなREPROです:私たちが使用している接続文字列がある

using (new TransactionScope()) 
{ 
    for (int j = 0; j < 15; j++) 
    { 
     using (var transactionScope = new TransactionScope(TransactionScopeOption.Required)) 
     using (var session = sessionFactory.OpenSession()) 
     { 
      for (int i = 0; i < 200; i++) 
      { 
       var obj = [create new NHibernate mapped obj] 
       session.Save(obj); 
      } 
      session.Flush(); 
      transactionScope.Complete(); 
     } 
    } 
} 

データソース=サーバー;ユーザーID =ユーザー;パスワード=パスワード; Enlist = true;

明らかにこれはやっているように見えますが、製品コードのケースはもっと複雑です(外部トランザクションループと内部トランザクションループは非常に分かれています)。

ビルドサーバーでは、外部ループ(j)の5番目の反復で確実に爆発します。私のローカルマシン上を通過するのを見て、これがトランザクションや接続の設定された制限の何らかの種類に当たっているのだろうか?

誰かが私が試してみることができるどんな趣味を持っていますか?それを修正する明白な方法は、この状況をよりうまく処理するためにコードを変更することですが、なぜそれが1つのマシンで動作し、別のマシンで動作しないのか理解したいと思います。ありがとう!

+0

あなたはどのバージョンのNHibernateを使用していますか? –

+0

Oracle版ですか? – DCookie

+0

そして、あなたはOracleエラー番号を取得していますか? – DCookie

答えて

3

これはあなたのOracleデータベース構成と関係があります。

  • 両方の環境で同じデータベースサーバーを使用していますか?
  • どのバージョンのデータベースを使用していますか(10gかかりますか?)ここで

私はこれらの仮定に基づいて見つけることができるものです:

  • チェックTuning Microsoft Transaction Server PerformanceORAMTS_NET_CACHE_MAXFREEパラメータのデフォルト値は5に設定されています.となる可能性があります。が問題に関連している可能性があります。しかし、何らかの行動をとる前にページ全体を読んでください(SESSIONSPROCESSESのパラメータも増やしてみてください)。
  • enable tracing on Oracle MTS実際に何が起こっているか見るには、
  • まだ詰まっている場合、より多くの洞察を得るためにenable tracing on MSDTCとすることができます。
+0

バージョン番号は上のコメントにあります。私は、私のdevマシン上でテストを実行するときとビルドマシン上で実行しているときに、同じデータベースサーバーに接続しています。 maxfreeパラメータは、my devボックスとビルドマシンで同じですので、問題の原因とは思われません。リンクをありがとう、私はOracle MTSのトレースを有効にしようとするつもりです。 –

+0

トレースに表示されるエラーは、次のとおりです。enlistInMSDTCTxn() - エラー0x8004d00eを登録しています。私はこのエラー番号について掘り下げており、MSDTCのトレースも見ているかもしれません。 –

関連する問題