【问题标题】:SQL - waiting for a rollback to completeSQL - 等待回滚完成
【发布时间】:2015-12-29 04:56:16
【问题描述】:

我正在使用CommittableTransaction 删除大量记录,超时时间为 300 秒。偶尔会出错

SqlException:超时已过期。在操作完成之前超时时间已过或服务器没有响应。

似乎在超时后,SQL 正在自动执行回滚,并且回滚需要大约 200 秒才能完成。

但我当前的 C# 代码捕获了SqlException 并检查了TransactionStatus(即Aborted)并继续进行。由于正在回滚,所以我应该等到回滚完成。有没有办法找到回滚状态?或者我该如何处理这种情况?

【问题讨论】:

  • 你也可以手动设置超时时间..
  • 请注意,回滚不是由 C# 代码发起的。事务超时后似乎 SQL Server 正在自动执行回滚。
  • @WPFLearner,SQL Server 中没有查询超时之类的东西——它纯粹是客户端的概念。基本上,在将每条语句发送到 SQL Server 之后,数据提供者层会等待指定的时间段,如果过期,则将低级 Abort 命令发送到连接中。因此,取消处理的不是您的代码,是的,但它仍然是客户端代码。
  • @RogerWolf,我明白你的意思。在客户端,有没有办法等待回滚结束?

标签: c# sql sql-server transactions sqlexception


【解决方案1】:

从这里 Implementing an Explicit Transaction using CommittableTransaction

一个 CommittableTransaction 对象可以跨函数调用和使用 线程。但是,由应用程序开发人员来处理 异常,并在以下情况下专门调用 Rollback 方法 失败。

我认为您可以在捕获块中显式调用Transaction.Rollback(Exception) SqlException。所以你等待完成操作回滚。

【讨论】:

  • 在 SqlException 处理程序中尝试了 Transaction.Rollback(Exception),但它没有等待回滚结束。在调用 Rollback 之前,检查异常处理程序中的 Transaction 状态,它已经 Aborted。
猜你喜欢
  • 1970-01-01
  • 2016-03-09
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
相关资源
最近更新 更多