ADO.NET重试一个sql连接内的事务

问题描述:

我尝试使用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部分我想每次调用相同的逻辑。有时它会崩溃(例如死锁),我想要回滚已经完成的操作,并在新事务中再次重试相同的命令。据我的理解,我可以做到。谢谢! –

如果所有的事务都被提交或回滚,没有理由不能在同一个连接上继续创建事务。

我会质疑为什么第一次尝试失败,但我假设你会在每次提交事务的尝试之间放置一些延迟(可能递增)。

+0

在大多数情况下,它可以避免发生很少的死锁。我以同样的方式思考,但并不完全确定。谢谢你的回答! –