C# SQL事务中的ExecuteOnQueryAsync和commit

C# SQL事务中的ExecuteOnQueryAsync和commit,c#,ado.net,C#,Ado.net,我正在寻找我创建的一段代码的帮助,我正在尝试在事务中从c#进行异步SQL调用,例如,我可能正在更新或删除表中的行 这是我到目前为止所拥有的,但我似乎找不到在事务中执行此操作的更多信息,从我这里所拥有的以及我到目前为止所了解的情况来看,如果命令耗时,我相信它可能会尝试在命令完全完成之前提交事务。如果你能给我举个例子,我将不胜感激 var sqlQuery = "delete from table"; using (var connection = new SqlConnection

我正在寻找我创建的一段代码的帮助,我正在尝试在事务中从c#进行异步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();
                }
            }
        }

谢谢,

您的代码看起来不错。我刚刚在命令的执行中添加了一个try/catch,以便在事务失败时回滚。因为您在
await命令行中使用了
await
关键字执行将一直阻止,直到方法返回为止,不管它需要多长时间(除非您从命令本身获得超时异常,在这种情况下,您应该将命令的执行超时设置得更高,或者找出它需要多长时间的原因)


@Igor感谢您的帮助,该方法实际上是从另一个类调用的,该类被包装在一个try-catch中-很抱歉我在我的帖子中提到了这一点。非常好。您仍然需要对已创建的
SqlTransaction
的引用,尽管这样您就可以在代码中执行
tran.RollBack()
(请参见下面的答案),但让调用代码这样做毫无意义,除非这是来自更大数据库抽象包装器的小样本或其他内容。@Igor Good shout,感谢您的回答在tran.Commit()中可以获得由于命令超时而导致的异常
    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();
        }
    }