2017-07-31 45 views
2

我嘗試使用ADO.NET和事務實現簡單的重試邏輯。 的代碼示例:ADO.NET重試一個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; 
      } 
     } 

是否還好一個連接中創建另一個事務的前一個被rollbacked後?

預先感謝您!

+1

@Anderi,它取決於目的,如果一個事務對另一個事務是不相關的,那麼這兩個事務必須處於單個提交中,否則更好地鬆散地耦合它們。 –

+0

@HameedSyed,在try部分我想每次調用相同的邏輯。有時它會崩潰(例如死鎖),我想要回滾已經完成的操作,並在新事務中再次重試相同的命令。據我的理解,我可以做到。謝謝! –

回答

1

如果所有的事務都被提交或回滾,沒有理由不能在同一個連接上繼續創建事務。

我會質疑爲什麼第一次嘗試失敗,但我假設你會在每次提交事務的嘗試之間放置一些延遲(可能遞增)。

+0

在大多數情況下,它可以避免發生很少的死鎖。我以同樣的方式思考,但並不完全確定。謝謝你的回答! –