【问题标题】:Fate of an ADO.Net Transaction when connection is suddenly broken连接突然断开时 ADO.Net 事务的命运
【发布时间】:2014-03-22 16:58:45
【问题描述】:

考虑下面的示例代码。

如果在第 2 步时与数据库的连接突然中断(即第二个命令),那么即使我们尝试回滚事务,它也不会回滚,因为没有与数据库的连接服务器。

在这种情况下,数据库服务器端的事务对象会发生什么? 会一直处于等待模式吗?我当我尝试通过 VPN 连接到数据库服务器来在 ADO.Net 中运行长事务时,就出现了这种情况。

using (SqlConnection connection =
        new SqlConnection(connectionString))
{
SqlCommand command = connection.CreateCommand();
SqlTransaction transaction = null;

try
{
    // BeginTransaction() Requires Open Connection
    connection.Open();

    transaction = connection.BeginTransaction();

    // Assign Transaction to Command
    command.Transaction = transaction;

    // Execute 1st Command
    command.CommandText = "Insert ...";
    command.ExecuteNonQuery();

    // Execute 2nd Command
    command.CommandText = "Update...";
    command.ExecuteNonQuery();

    transaction.Commit();
}
catch
{
    transaction.Rollback();
    throw;
}
finally
{
    connection.Close();
}

}

【问题讨论】:

    标签: c# transactions ado.net sql-server-2008-r2


    【解决方案1】:

    连接中止将触发任何待处理事务的回滚。见Controlling Transactions

    如果客户端与数据库引擎实例的网络连接中断,则当网络通知该实例中断时,该连接的所有未完成事务都会回滚

    【讨论】:

    • 那么,它会在连接断开后立即“自动”回滚?感谢您的出色回答。
    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    相关资源
    最近更新 更多