我试图在SQL Server的表中插入数十万条记录。我想模拟数据库恢复,并且这样做,我需要在插入过程中“中断”执行。我正在使用事务开始并逐批提交插入插入。假设我提交了2万条记录,想开始另外2万条记录的交易,我想在第二批插入期间中断交易。
我知道终止执行,但是它只是停止执行,并且仍然会插入记录。它不会以任何方式使其崩溃。我需要确保在中断事务时,它不会最终被提交到数据库。
有什么办法吗?
赞赏任何建议。
答案 0 :(得分:0)
我知道要终止执行,但这只会停止执行 执行和记录仍将被插入。它不会崩溃 任何方式。我需要确保在中断交易时 最终并没有提交到数据库。
这是错误的。
如果中断INSERT
,它将回滚。
这是复制品:
create table dbo.nums(n bigint not null);
go
insert into dbo.nums
select row_number() over (order by getdate()) as n
from sys.columns c1 cross join sys.columns c2 cross join sys.columns c3;
如果您中断此代码并执行
select * from dbo.nums;
您会发现它为空。
因此,请确保此事务在被中断后将永远不会提交。
假设我提交了2万条记录,并希望开始交易 对于另外2万条记录,我想中断交易 在第二批插入期间。
您可以这样做,如果您希望有更多时间来中断代码,只需添加waitfor delay
:
begin tran
insert into dbo.nums
select row_number() over (order by getdate()) as n
from sys.columns c1 cross join sys.columns c2 cross join sys.columns c3;
waitfor delay '00:01:00';
...并确保它不会被提交。
答案 1 :(得分:0)
如果您需要确保何时中断事务,它最终并不会提交到数据库。您需要使用:
SET XACT_ABORT { ON | OFF }
当Transact-SQL语句引发运行时错误时,这基本上将回滚当前事务
查看链接以获取更多信息