我碰巧执行了与此类似的查询:
update table1
set data=(select data from table1 where key1=val1 and key2=val2)
应该只更新一行,但由于我错过了第二个where
子句,我猜它开始更新数据库中的每一行,其中包含几百万行。
正确的查询大概需要0秒,并且会是:
update table1
set data=(select data from table1 where key1=val1 and key2=val2)
where key1=val1 and key2=val3
几秒钟后,我意识到这花了太长时间才停下来。
数据库设置为完全恢复模式并在sql server 2008 r2
上运行。
问题是,这个查询有什么影响?我希望由于查询在完成之前停止并且SQL Server自动回滚更改,因此不会产生任何影响。这是正确的吗?
如果没有,我如何在特定时间点将数据库回滚到其状态(就在我进行不幸的更新之前)?
(我看到了这个问题:If I stop a long running query, does it rollback?但它的不同之处在于它执行了多项更改,而不仅仅是一项。)
(是的,我确实有最新的备份,但考虑到数据库的大小,我不希望从备份中恢复)
答案 0 :(得分:3)
如果您的取消命令及时发布,则会完全回滚。 DML语句总是全有或全无。您应该检查数据以确保您的取消确实及时到达。事务已经提交后,它可能已经到了最后一毫秒左右。