如果进程意外终止,作为 SqlTransaction 或 TransactionScope 基础的事务是否会回滚?

Does the transaction underlying a SqlTransaction or a TransactionScope get rolled back if a process terminates unexpectedly?

我正在编写一个应用程序来更新单独但相关的数据库表中的数据。我想在我的代码中的事务中执行更新查询。我知道有两种可能的方法:

我的问题是:如果进程在中间终止,那么这些模型中的任何一个都会导致事务被回滚吗?也就是说,如果有人真的强行终止了进程?例如,如果我有使用第一个模型的代码,并且进程在两个命令之间终止,事务会回滚吗?

try
{
    using (var conn = new SqlConnection(connectionString))
    {
        using (var tran = conn.BeginTransaction("MyTran"))
        {
            using (var firstCommand = new SqlCommand(firstQuery, conn))
            {
                firstCommand.ExecuteNonQuery();
            }

            //PROCESS IS TERMINATED HERE.

            using (var secondCommand = new SqlCommand(secondQuery, conn))
            {
                secondCommand.ExecuteNonQuery();
            }

            tran.Commit();
        }
    }
}
catch (Exception)
{
    //do whatever.
}

或者如果我有以下使用第二个模型的代码,并且在两个方法调用之间进程终止,事务会被回滚吗?

try
{
    using (var scope = new TransactionScope())
    {
        MyFirstUpdate();
        //PROCESS IS TERMINATED HERE.
        MySecondUpdate();
        scope.Complete();
    }
}
catch (Exception)
{
   //do whatever.
}

我无法在 MSDN 或其他地方找到任何信息来说明这两种情况下的结果。

如果未提交事务,则会回滚。终止进程会阻止应用 COMMIT,因为 TransactionScope.Complete 从未被调用,并终止连接,这将导致回滚。

如果我们谈论突然终止进程,"rollback" 逻辑的 none 有机会 运行 并且不会向服务器发送任何消息。这不同于一般的异常处理,其中 finally 块通常会确保回滚发生。

SQL 服务器的行为是对连接应用超时 - 如果连接在超时之前未发送保持活动消息,则它被认为已死并在 SQL 服务器端。如果有事务未决,则在关联连接关闭时回滚。