2009-04-13 22 views
1

私はこの問題を解決してください:周囲MSMQトランザクションはトランザクションタイムアウトが期限切れ)

があります。私はロギングに新しいトランザクションを使用しようとしていますが、変更をサブミットしようとしている間に次のエラーが表示されます - タイムアウトが切れましたタイムアウト時間が経過して操作が完了しない、またはサーバーが応答しません。ここにコードです:

public static void SaveTransaction(InfoToLog info) 
    { 
     using (TransactionScope scope = 
      new TransactionScope(TransactionScopeOption.RequiresNew)) 
     { 
      using (TransactionLogDataContext transactionDC = 
         new TransactionLogDataContext()) 
      { 
       transactionDC.MyInfo.InsertOnSubmit(info); 

       transactionDC.SubmitChanges(); 
      } 

      scope.Complete(); 
     } 
    } 

私を助けてください。 Thx。

答えて

1

タイムアウトを増やすことも、すべてを一緒に削除することもできます。以下のような

何か:

using(TransactionLogDataContext transactionDC = new TransactionLogDataContext()) 
{ 
    transactionDC.CommandTimeout = 0; // No timeout. 
} 

+0

ありがとうございます。この解決策は新たな疑問を生み出します。トランザクションの範囲が変更された場合、なぜ提出作業に時間がかかるのですか?データベースとアプリケーションは同じマシン上にあります。 – spkenny

+1

私はその質問に答えるのに十分な情報がありません。舞台裏で何が起こっているのかを見るためにSQLプロファイラを使用することを検討することができます。がんばろう。 – billb

1

ように注意してくださいあなたは言った:

はあなたに感謝。この解決策は新たな疑問を生み出します。トランザクションの範囲が変更された場合、なぜ提出作業に時間がかかるのですか?データベースおよびアプリケーションは、あなたがすぐそこに新しいのDataContextを作成しているためであること

同じマシン上にある:

TransactionLogDataContext transactionDC = new TransactionLogDataContext()) 

新しいデータコンテキストADO.NETを使用して新しい接続を開きます(接続文字列がある場合でも、あなたが賢明な接続プーリングをしない限り)。 2つ以上の接続インスタンスを処理しようとするときのトランザクションコンテキスト内( )ADO.NETはトランザクションを分散トランザクションに自動的に昇格させ、MSDTCに登録しようとします。 MSDTCへの接続ごとに非常に最初のトランザクションを登録するには時間がかかります(私にとっては30秒以上かかる)が、連続トランザクションは高速です(私の場合は60ms)。これを見てくださいhttp://support.microsoft.com/Default.aspx?id=922430

できることは、新しいDataContextを作成するときにトランザクションと接続文字列(可能な場合)を再利用することです。

TransactionLogDataContext tempDataContext = 
     new TransactionLogDataContext(ExistingDataContext.Transaction.Connection); 
tempDataContext.Transaction = ExistingDataContext.Transaction; 

ここで、ExistingDataContextは、アンビエントトランザクションを開始したものです。

MS DTCをスピードアップしてください。

また、billbによって提案されたSQLプロファイラを使用し、異なるコマンド間でSessionIdを探します(あなたのケースではsavelogを保存します)。 SessionIdが変更された場合、実際には2つの異なる接続を使用しています。その場合、トランザクションを再利用する必要があります(MS DTCに昇格したくない場合)。