1

前几天,我研究SqlTransaction了一下,我知道了它的目的SqlTransaction.Commit()——它应该“提交数据库事务”。- 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 Server 位于另一台计算机上。

我猜:commit 方法有两个周期,周期 1:当我执行时tran.Commit(),编译器会向 SQL Server 发出信号并与 SQL Server 对话:“我没事,请帮我提交(更改)数据”,然后 SQL Server 将执行编译器的请求。阶段2:当SQL Server完全执行编译器的请求时,执行结果将返回给我们的编译器。当我们的编译器收到执行结果时,我们的编译器将继续编译下一个命令行(“return true”)。

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

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

谢谢!

4

1 回答 1

3
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

于 2015-02-06T06:06:22.530 回答