不要在取消删除查询时回滚

时间:2014-11-28 14:25:22

标签: sql sql-server sql-server-2008-r2

有没有办法在取消删除查询时禁用回滚?那么删除的哪些行仍然被删除而那些未删除的行仍然存在?

我知道它打破了ACID,但是我犯了一个错误,它已经取消了3个小时的查询...而且我不希望这些行被退回。只是为了将来再次发生这种情况,如果我取消,我就不会锁定桌子。

谢谢!

2 个答案:

答案 0 :(得分:1)

我知道Sql Server讨厌游标,但这似乎是尝试游戏的好时机。这里有几个好处远远超过额外的处理时间:

  • 你显然删除了很多行。在一个delete语句中执行此操作可能会长时间锁定整个表(超过某一点,Sql Server将跳过行锁定并尝试锁定整个表)。一次删除一行可以大大减轻这种锁定问题。
  • 您可以在循环内的delete内放置try。发生错误时,将详细信息写入日志表。这将为您提供有关导致错误的原因所需的信息,以便您可以找出解决方法。
  • 最后,您已删除并提交了所有可删除的行,并且您只记录了有问题的记录。它并没有比这更好。
  • 游标很慢?是的,但是如果你使用过一个,那么很久以前你就已经完成了这个。

我知道Sql Server开发人员将游标视为 Evil Incarnate 。他们不是。它们是一种工具,就像任何工具都应该热情地使用,只要收益超过成本。

答案 1 :(得分:0)

不是直接没有。

通常的作用是将删除分成批处理并运行WHILE循环,直到完成所有操作:

SET ROWCOUNT 10000
SELECT top 1 * from sys.objects --prime ROWCOUNT

WHILE @@ROWCOUNT > 0
BEGIN
    DELETE FROM TABLExxx WHERE 1=0 --Delete conditions
END

一次删除10000个 1 行,因此当您取消时,您只会撤消工作的


1 10000完全是任意的 - 您可能希望根据您自己的数据来调高或调整此值,每批次需要多长时间以及如果您取消取消,您将失去多少工作脚本。