SQLTransaction.Commit()如何工作?

时间:2015-02-06 05:20:27

标签: c# sqltransaction

前几天,我研究过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()的两个时期的预测是否正确?

谢谢!

1 个答案:

答案 0 :(得分: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