【发布时间】:2018-10-29 15:19:32
【问题描述】:
我正在审查一个开发者的脚本,以从一个比指定日期更早的大表中删除所有数据。
SET @R = 1;
WHILE @R > 0
BEGIN
----Begin Transaction
DELETE TOP (100000) FROM
TBL_MYTABLE
WHERE dateCreated < @DELETEDATE;
----Commit Transaction;
SET @R = @@ROWCOUNT;
END;
让我印象深刻的一件事是,他正在检查@@ROWCOUNT 的值,而没有对@R 变量做任何事情。该语句是否自动提交事务?还是必须先完成整个 WHILE 循环?
编辑:作为后续问题,我将如何确定循环的每次迭代是否正在提交,或者它是否一直等到结束?
【问题讨论】:
-
当然不会提交事务。提交事务的方式是 COMMIT TRANSACTION。如果检查行数变量 auto 提交了一个设计非常糟糕的交易。
-
他们确实在循环的每次迭代中使用了@R 变量。他们在这里批量删除(100K)。您始终可以在循环底部打印@R。每次将是 100K,直到最后一次迭代
-
当然,对于自动提交事务,如果这里没有明确的事务管理,
DELETE本身就会提交事务。 -
此外,在此代码中没有显式事务。有一个关于启动的注释,但实际代码中没有。
-
我的猜测是有人在写的时候加上了开头/结尾,然后在某个时候把它注释掉了。