【问题标题】:SQL Server - Does @@RowCount automatically commit transaction?SQL Server - @@RowCount 是否自动提交事务?
【发布时间】: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 本身就会提交事务。
  • 此外,在此代码中没有显式事务。有一个关于启动的注释,但实际代码中没有。
  • 我的猜测是有人在写的时候加上了开头/结尾,然后在某个时候把它注释掉了。

标签: sql-server sqlperformance


【解决方案1】:

简短的回答是不,它没有。因为没有COMMIT TRANSACTION关键字

样本为批量删除数据。

这是一个示例,我们可以看到我在 T 计数小于或等于 2 时设置了 BREAK;

当它退出循环我们从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

sqlfiddle

【讨论】:

  • 您的意思是 DELETE 语句在每次循环运行时提交更改?
  • 当您调用DELETE 语句时,它将执行DELETE 操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 2014-11-25
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
相关资源
最近更新 更多