【问题标题】:ExecuteNonQueryAsync and commit in a SQL TransactionExecuteNonQueryAsync 并在 SQL 事务中提交
【发布时间】:2018-08-20 17:38:00
【问题描述】:

我正在对我创建的一段代码寻求帮助,我试图在事务中从 c# 进行 Async SQL 调用,例如我可能正在更新或删除表中的行。

这是我到目前为止所拥有的,但我似乎无法找到关于在事务中执行此操作的太多信息,从我在这里所拥有的以及到目前为止我所了解的,我相信它可能会尝试在命令之前提交事务如果命令耗时,则已完全完成。如果您能建议/指出一个示例,我将不胜感激。

var sqlQuery = "delete from table";
        using (var connection = new SqlConnection(ConnectionString))
        {
            await connection.OpenAsync();
            using (var tran = connection.BeginTransaction())
            {
                using (var command = new SqlCommand(sqlQuery, connection, tran))
                {
                    await command.ExecuteNonQueryAsync();
                    tran.Commit();
                }
            }
        }

谢谢,

【问题讨论】:

  • @Igor 感谢您的帮助,该方法实际上是从包装在 try catch 中的不同类调用的 - 抱歉,我应该在我的帖子中提到这一点。
  • 好交易。您仍然需要对创建的SqlTransaction 的引用,以便您可以在代码中执行tran.RollBack()(请参阅下面的答案),除非这是来自更大数据库抽象包装器的小样本或东西。
  • @Igor 好声音,谢谢你的回答

标签: c# ado.net


【解决方案1】:

您的代码看起来不错。我刚刚在命令的执行中添加了一个 try/catch,这样你就可以在它失败时回滚你的事务。因为您在await command.ExecuteNonQueryAsync(); 行上使用await 关键字,所以无论需要多长时间,执行都会阻塞,直到方法返回(除非您从命令本身获得超时异常,在这种情况下,您应该将命令的执行超时设置得更高或弄清楚为什么要花这么长时间)。

    var sqlQuery = "delete from table";
    using (var connection = new SqlConnection(ConnectionString))
    {
        await connection.OpenAsync();
        using (var tran = connection.BeginTransaction())
        using (var command = new SqlCommand(sqlQuery, connection, tran))
        {
            try {
                await command.ExecuteNonQueryAsync();
            } catch {
                tran.Rollback();
                throw;
            }
            tran.Commit();
        }
    }

【讨论】:

  • tran.Commit() 中可能会因命令超时而出现异常
猜你喜欢
  • 2014-10-17
  • 2014-11-25
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
相关资源
最近更新 更多