SQLTransaction.Commit() 是如何工作的?

How does SQLTransaction.Commit() work?

前几天研究了一下SqlTransaction,知道了SqlTransaction.Commit()的用途——应该是"commit the database transaction." - MSDN。

但是它是如何工作的?

例如:我写了一段代码是这样的:

using (SqlTransaction tran = connection.BeginTransaction())
{
    try
    {
        using (SqlCommand cmd = connection.CreateCommand())
        {
            cmd.CommandText = msg.command;
            cmd.Transaction = tran;

            cmd.ExecuteNonQuery();                        
        }
    }
    catch (Exception)
    {
        // if all of above have any exception, that's mean my transaction is 
        // failure and my database has no change. 
        return false;
    }

    tran.Commit();

    // if all of above have no problems, that's mean my transaction is successful
    return true;
    connection.Dispose();
}

在这种情况下,SQL服务器在另一台计算机上。

我猜:commit 方法有两个周期,周期 1:当我实现 tran.Commit() 时,编译器将向 SQL 服务器发送信号并与 SQL 服务器通信:"I'm ok, please help me commit (change) data",然后SQL 服务器将执行编译器的请求。第二阶段:当SQL服务器完全执行编译器的请求时,执行结果将return给我们的编译器。当我们的编译器收到执行结果时,我们的编译器将继续编译下一个命令行("return true")。

但是如果在第二阶段,连接断开,执行结果不会传回我们的编译器。在这种情况下,我们的交易成功与否?数据是否保存在 SQL 服务器中?

附加问题:我对 SQLTransaction.Commit() 两个周期的预测是否正确?

谢谢!

try
{
    using (var conn = new SqlConnection(/* connection string or whatever */))
    {
        conn.Open();

        using (var trans = conn.BeginTransaction())
        {
            try
            {
                using (var cmd = conn.CreateCommand())
                {
                    cmd.Transaction = trans;
                    /* setup command type, text */
                    /* execute command */
                }

                trans.Commit();
            }
            catch (Exception ex)
            {
                trans.Rollback();
                /* log exception and the fact that rollback succeeded */
            }
        }
    }
}
catch (Exception ex)
{
    /* log or whatever */
}

并阅读这篇文章 https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.commit(v=vs.110).aspx