【问题标题】:ADO.NET retry of transaction within one sql connectionADO.NET 在一个 sql 连接中重试事务
【发布时间】:2018-01-07 02:14:36
【问题描述】:

我尝试使用 ADO.NET 和事务实现简单的重试逻辑。 代码示例:

        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;
            }
        }

在前一个连接回滚后,是否可以在一个连接中创建另一个事务?

提前谢谢你!

【问题讨论】:

  • @Anderi ,这取决于目的,如果一个事务依赖于另一个事务,那么这两个事务必须在单个提交中,否则最好松散耦合它们。
  • @HameedSyed,在尝试部分我想每次都调用相同的逻辑。有时它会崩溃(例如死锁),我想回滚已经完成的操作并在新事务中再次重试相同的命令。从您的回答中我了解到,我可以做到。谢谢!

标签: c# tsql transactions ado.net


【解决方案1】:

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

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

【讨论】:

  • 在大多数情况下,这是对很少发生的死锁的保护。我也有同样的想法,但并不完全确定。谢谢你的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多