【问题标题】:Transactions not being committed although I have "Commit Transaction" statement尽管我有“提交交易”声明,但未提交交易
【发布时间】:2021-01-15 14:33:34
【问题描述】:

我正在使用 SQL Azure 并尝试对大表进行批量条件删除,示例:

DECLARE
    @LargestKeyProcessed BIGINT =1,
    @NextBatchMax BIGINT,
    @msg varchar(max) ='';
 
WHILE (@LargestKeyProcessed <= 1000000)
BEGIN
 Begin Transaction
 SET @NextBatchMax = @LargestKeyProcessed + 50000;
  DELETE From mytable
  WHERE Id > @LargestKeyProcessed AND Id <= @NextBatchMax And some logic
  SET @LargestKeyProcessed = @NextBatchMax;
    set @msg=''+@LargestKeyProcessed;
  RAISERROR(@msg, 0, 1) WITH NOWAIT
  Commit Transaction
END

命令成功执行后,我关闭选项卡,但 SSMS 说有未提交的事务,尽管提交语句在每次迭代中。此外,数据库大小似乎保持不变。

恳请您支持解释为什么会发生这种情况

非常感谢

【问题讨论】:

  • 在引发错误之前回滚事务。
  • @GordonLinoff 我怀疑 Techy 正在尝试使用 RAISERROR(@msg, 0, 1) WITH NOWAIT 就像 PRINT 语句在批次进行时获得即时反馈。 Severity=0 不应该影响事务,但要确保我会在提交后移动它。
  • 每个语句都在事务中运行。如果您没有打开一个,默认情况下 SQL Server 会打开一个,让语句运行,然后自动提交。通过手动有效地完成相同的工作,您实际上并没有获得太多收益。
  • implicit_transactions 是开还是关?
  • 愚蠢的故障排除想法——将“DELETE”更改为“SELECT COUNT(*)”时会得到什么?这是为了确保您实际上获得了与您的 WHERE 条件匹配的行。如果你得到零——那么问题就出在 WHERE 上。

标签: sql sql-server azure-sql-database ssms


【解决方案1】:

我认为您可以尝试将SET IMPLICIT_TRANSACTIONS OFF 添加到sql。如下,看看是否解决了你的问题。

DECLARE
    @LargestKeyProcessed BIGINT =1,
    @NextBatchMax BIGINT,
    @msg varchar(max) ='';
 
WHILE (@LargestKeyProcessed <= 1000000)
BEGIN
 SET IMPLICIT_TRANSACTIONS OFF  
 Begin Transaction
 SET @NextBatchMax = @LargestKeyProcessed + 50000;
  DELETE From mytable
  WHERE Id > @LargestKeyProcessed AND Id <= @NextBatchMax And some logic
  SET @LargestKeyProcessed = @NextBatchMax;
    set @msg=''+@LargestKeyProcessed;
  RAISERROR(@msg, 0, 1) WITH NOWAIT
  Commit Transaction
END

【讨论】:

  • 不幸的是,这并没有帮助,一旦我停止查询并关闭窗口,它仍然说有未提交的事务
  • 更改SET @NextBatchMax = @LargestKeyProcessed + 50000; -> SET @NextBatchMax = @LargestKeyProcessed + 10000; ?
  • 我尝试了可变批量大小,但还是一样:(
猜你喜欢
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多