SQL Server:如果我在一个长时间运行的更新完成之前停止它,它会自动回滚吗?

tom*_*msv 2 sql-server rollback sql-server-2008-r2

我碰巧执行了一个类似于这个的查询:

update table1
set data=(select data from table1 where key1=val1 and key2=val2)
Run Code Online (Sandbox Code Playgroud)

它应该只更新一行,但由于我错过了第二个where子句,我猜它开始更新数据库中的每一行,其中包含几百万行。

正确的查询将花费大约 0 秒,并且将是:

update table1
set data=(select data from table1 where key1=val1 and key2=val2)
where key1=val1 and key2=val3
Run Code Online (Sandbox Code Playgroud)

几秒钟后,我意识到它花了太长时间并停止了它。

数据库设置为完全恢复模式并在sql server 2008 r2.

问题是,这个查询的效果是什么?我希望不会有任何影响,因为查询在完成之前停止并且 SQL Server 自动回滚更改。那是对的吗?

如果没有,我如何将数据库回滚到特定时间点的状态(就在我进行不幸的更新之前)?

(我看到了这个问题:如果我停止一个长时间运行的查询,它会回滚吗?但它的不同之处在于它执行多个更改而不是一个。)

(是的,我确实有最近的备份,但考虑到数据库的大小,我不想从备份中恢复)

usr*_*usr 6

如果您的取消命令及时出现,则它会完全回滚。DML 语句总是全有或全无。您可能应该检查数据以确保您的取消及时到达。它可能在事务已经提交后的最后一毫秒左右到达。