我执行了删除16 000 000行的查询:
delete from [table_name]
执行后3分钟没有结果,我取消了查询。
花了一段时间取消,但最后它说“查询已取消”
这是否意味着删除了16 000 000中的任何一项?或者他们还在那里吗?
这不是真正的查询,我只是用它作为例子。
答案 0 :(得分:6)
行应该在那里。如果取消该语句,则回滚删除。 完成后,即可提交更改。
答案 1 :(得分:1)
首先,如果您想确保可以成功取消查询,则需要使用事务。如果您正在使用事务并且该事务已回滚,则不会删除任何行。如果您设置了该标志(see here),管理工作室将仅使用隐式事务。
那就是说,我真的好奇,因为我认为删除操作应该是一个“原子”操作,所以我编写了以下代码来测试:
create database test_database
use test_database
go
create table sample (
ID BIGINT IDENTITY(1,1) PRIMARY KEY,
value VARCHAR(25)
)
declare @id int
select @id = 1
-- up 90000 if this doesn't have enough rows
while @id >=1 and @id <= 90000
begin
insert into sample (value) values ('abcdefg');
select @id = @id + 1
end
-- run, but cancel in the middle
delete from sample
-- check, are there 90000 records now?
select count(id) from sample
-- clean up
drop table sample
事实证明,如果单击“取消”,它会将其视为“原子”语句,这意味着所有行仍然存在。你的环境可能会有所不同,所以要测试一下!