使用回滚停止查询是否可以保证回滚

时间:2015-02-17 17:32:36

标签: sql sql-server

说我有这样的查询:

BEGIN Transaction
UPDATE Person SET Field=1
Rollback

有一亿人。二十分钟后我停止了查询。 SQL Server是否会回滚更新的记录?

3 个答案:

答案 0 :(得分:8)

单个更新不会更新某些行。它将全部更新或0。

因此,如果您取消查询,则不会更新任何内容。

这是SQL Server遵循的atomicity database systems

换句话说,你不必在最后做回滚,无论如何都没有提交。

当您取消查询时,它仍将保持锁定,直到所有内容都回滚,因此无需恐慌。

您可以自己测试,执行长查询,取消它,您会发现在该过程真正结束之前需要一段时间。

答案 1 :(得分:2)

虽然update语句无法完成,但事务仍将处于打开状态,因此请确保手动回滚或关闭窗口以终止事务。您可以通过在事务中包含两个语句来测试这一点,其中第一个语句完成,而在第二个语句运行第二个语句时取消 - 您可以在停止事务后提交事务,然后获取结果的前半部分。

BEGIN Transaction
    UPDATE Person SET Field=1 WHERE Id = 1
    UPDATE Person SET Field=1
Rollback

如果你开始这个,给它足够的时间让第一行完成,点击SSMS中的Stop按钮,然后执行commit transaction,你会看到第一个更改确实被应用了。既然你显然不想让交易的一部分成功,我会在你停止它之后杀死整个窗口,这样你就可以确保所有东西都回滚了。

答案 2 :(得分:0)

由于您已打开事务,手动停止查询并未完成事务,此事务仍将处于打开状态,此表的所有后续请求都将被阻止。

您可以执行以下任一选项

  1. 使用命令KILL SPID终止连接(SPID是连接的进程ID)    注意:这将自动回滚您所做的更改,您可以使用命令KILL SPID WITH STATUSONLY(杀死后)监视回滚状态
  2. 手动运行ROLLBACK命令
  3. ** SPID是您的请求ID,您可以从sys.sysprocesses表中找到它/您也可以在Management Studio查询窗口中找到它在括号内的数字/您也可以在管理的右下角找到它登录名旁边的工作室。

    示例SQLQuery2.sql ...(161) - 161是你的spid。