我想运行一个查询,但只是为了测试它并有可能回到我看到回滚事务的先前状态。
我之前必须运行这个命令吗?
delete * from myTables
where colName = "***"
我想运行一个查询,但只是为了测试它并有可能回到我看到回滚事务的先前状态。
我之前必须运行这个命令吗?
delete * from myTables
where colName = "***"
你确定你在使用
SQL Server
?的正确语法delete
应该如下所示:要测试您根本不需要
delete
smth 的结果,您可以使用适当select
的 ,您的问题select
将是这个:虽然在测试环境中对一个有 10 行的表
begin tran
执行 adelete
和 then可能不是问题rollback
,但在大量数据或并发环境中可能是一个问题,在没有onlock
的情况下你的表,并且(及其)将产生很多,因为在任何恢复模型中。index
colname
delete
rollback
transaction log
delete
fully logged operation
是的,您可以使用它
BEGIN TRANSACTION ... ROLLBACK TRANSACTION
来检查某些查询。我将双引号 (
"
) 更改为有效的单引号或撇号 ('
),并将delete *
更改为仅delete
与 SQL Server 语法匹配。结果#1
结果#2
但是,对于在大表上发出删除的风险,sepupic 是完全正确的。如果我想测试我是否需要确切地知道删除需要多长时间,包括日志记录,我只会这样做。在大多数情况下,选择更适合测试目的。
如果您只想查看受影响的记录更改删除以选择并检查输出。如果你想使用事务,确保你的数据库中没有设置自动提交(只是为了确定)。然后根据您使用的 SQL 引擎,它将类似于
如果您对结果类型提交确认事务没问题,如果不回滚事务。如果您正在玩这样的事情,请始终在非生产数据库上进行。
一旦提交了事务,您就无法回滚事务,因此您无法运行它并在一段时间后改变主意。在正确运行它们之前,我有时会使用这种模式来测试 SSMS 中的临时更新语句的结果:
一旦您对结果感到满意,就会更改
ROLLBACK
为COMMIT
.不过,这远非 100% 安全:
不过,在生产或共享开发/测试/其他实例中仍然要非常小心:长时间运行的更新仍会消耗资源(IO、CPU、内存),因此可能会减慢其他用户的速度,并且会根据需要持有锁,因此您仍然可以导致您的数据更改语句通常会出现的延迟和其他问题(可能是死锁)。
如果您正在测试的代码调用其他可能导致您的事务回滚的过程并且不包括额外的批处理(额外
GO
的),您可能会发现调用的过程会杀死事务但下一个批处理运行时没有影响您的事务,ROLLBACK
因此您的某些测试最终会永久应用而不是回滚。与往常一样,如果您可以在单独的环境中进行测试,那将更加安全。
为了能够在事务提交后回滚,您需要先进行备份,并且您的回滚计划是从中恢复数据库。不幸的是,这也会回滚所有其他活动,因此它可能不适合共享或生产环境。