2017-07-31 12 views
2

ADO.NETとトランザクションを使用して簡単な再試行ロジックを実装しようとしています。 コードのサンプル:ADO.NETによる1つのSQL接続内でのトランザクションの再試行

 using(SqlConnection conn = new SqlConnection(m_connection)) 
     { 
      conn.Open(); 

      bool committed = false; 
      Exception exception = null; 
      for (int i = 0; i < s_attempts; i++) 
      { 
       SqlTransaction tran = conn.BeginTransaction(); 
       try 
       { 
        // different commands here.. 

        tran.Commit(); 
        committed = true; 
        break; 
       } 
       catch (Exception ex) 
       { 
        exception = ex; 
        tran.Rollback(); 
       } 
      } 

      if (!committed && exception != null) 
      { 
       throw exception; 
      } 
     } 

それは前回の1がロールバックされた後に1つの接続内で別のトランザクションを作成しても大丈夫ですか?

ありがとうございます!

+1

@Anderi、目的にもよりますが、あるトランザクションが別のトランザクションに依存している場合、それらの2つのトランザクションは単一コミットでなければなりません。 –

+0

@HameedSyed、tryセクションで毎回同じロジックを呼びたいと思います。ときどきクラッシュし(デッドロックなど)、既に完了したロールバックを行い、新しいトランザクションで同じコマンドを再試行します。あなたの答えから私が理解するように、私はそれを行うことができます。ありがとうございました! –

答えて

1

すべてのトランザクションがコミットまたはロールバックされていれば、同じ接続でトランザクションを作成できない理由はありません。

私は最初の試みが失敗した理由について質問しますが、私はトランザクションをコミットする各試行の間に若干の遅延(場合によっては増分)を置くと仮定しています。

+0

ほとんどの場合、まれに発生するデッドロックからの保護です。私は同じように思ったが、完全には分からなかった。答えてくれてありがとう! –

関連する問題