Sql server SQL Server-@@RowCount是否自动提交事务?

Sql server SQL Server-@@RowCount是否自动提交事务?,sql-server,sqlperformance,Sql Server,Sqlperformance,我正在查看一个开发人员的脚本,以便从一个大于指定日期的大表中删除所有数据 SET @R = 1; WHILE @R > 0 BEGIN ----Begin Transaction DELETE TOP (100000) FROM TBL_MYTABLE WHERE dateCreated < @DELETEDATE; ----Commit Transaction; SET @R

我正在查看一个开发人员的脚本,以便从一个大于指定日期的大表中删除所有数据

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循环必须首先完成吗


编辑:作为后续问题,我将如何确定循环的每个迭代是否正在提交,或者是否正在等待结束?

简短的回答是不,它没有。因为没有提交事务关键字

该示例是批量删除数据

这是一个例子,我们可以看到我设置了一个休息;当T计数值小于或等于2时

当它退出循环时,我们从T中选择数据,我们只能看到两行

CREATE TABLE T(
    i int

);
INSERT INTO T values (1);
INSERT INTO T values (2);
INSERT INTO T values (3);
INSERT INTO T values (4);
INSERT INTO T values (5);

DECLARE @R INT = 1
SET @R = 1;
WHILE @R > 0
    BEGIN

        DELETE TOP (1) 
        FROM T


        SET @R = @@ROWCOUNT;

        IF((SELECT COUNT(*) FROM T)<= 2)
          BREAK;

END;

SELECT * FROM T

当然,它不会提交事务。提交事务的方式是提交事务。如果检查row count变量,则自动提交一个事务,这将是一个非常糟糕的设计。在循环的每次迭代中,他们都会使用@R变量。他们在这里批量删除10万条。您始终可以在循环的底部打印@R。每次都是100K,直到最后一次迭代。当然,对于自动提交事务,如果这里没有显式的事务管理,则DELETE本身提交了事务。此外,在这段代码中没有显式的事务。有一条关于开始一个循环的注释,但实际代码中没有任何注释。我的猜测是,有人在编写begin/end时插入了begin/end,并在某个时候注释掉了它。您的意思是DELETE语句正在提交循环每次运行时的更改吗?当您调用DELETE语句时,它将执行DELETE操作。