【问题标题】:SQL Server 2005 transaction commit being ignoredSQL Server 2005 事务提交被忽略
【发布时间】:2011-12-20 06:35:31
【问题描述】:

我看到一些奇怪的行为,对于完全不相关的查询已经发生了不止一次。

Sql 查询中的 COMMIT TRANSACTION 语句似乎被忽略了,尽管没有发生错误,在表上留下锁,直到进程被终止。

这是一个例子:

BEGIN TRY

BEGIN TRANSACTION 

    UPDATE Elements.ProductDeparture
    SET DurationDays = 5,       
        FinishDate = DATEADD(day, 4, DepartureDate)
    WHERE DepartureCode LIKE 'PPAF%'
    AND   ProductID = 2359

COMMIT TRANSACTION 
END TRY

BEGIN CATCH
    PRINT 'Error: ' + ERROR_MESSAGE()
    ROLLBACK
END CATCH

查询没有出现错误(如果您在没有事务的情况下运行它,它会很好地完成)。该行为是可重现的(即,每次运行上述查询时都会发生,而不仅仅是间歇性地发生)。

这已经发生了两次,对于在事务中运行的完全不相关的查询。

这是奇怪的一点。我们已经在我们的开发环境和测试环境中运行它,没有任何问题。在生产环境中运行它会导致进程无法完成,并在表上保持锁定,直到进程被终止。它们都是 SQL Server 2005 环境。

是否有任何可能导致这种奇怪行为的 SQL Server 数据库设置?到目前为止,大约有 5 位开发人员看过它,但从未见过类似的东西。

【问题讨论】:

  • 死锁?如果我没记错的话,1 个进程并不等同于一个 SQL 语句——一个进程可以被多个连接共享。

标签: sql-server sql-server-2005


【解决方案1】:

一些想法:

  • 使用 SET XACT_ABORT ON 强制回滚并在出现任何错误时释放锁定
    这也抑制了错误 266
  • 首先测试现有事务
    我怀疑这是您的问题
  • 回滚前测试事务状态
  • ROLLBACK 自己什么都不做:你需要 TRANTRANSACTION

欲了解更多信息,请参阅:Nested stored procedures containing TRY CATCH ROLLBACK pattern?

所以,像这样

SET XACT_ABORT, NOCOUNT ON

DECLARE @starttrancount int

BEGIN TRY
    SET @starttrancount = @@TRANCOUNT

    IF @starttrancount = 0
        BEGIN TRANSACTION

    UPDATE Elements.ProductDeparture
        SET DurationDays = 5,       
            FinishDate = DATEADD(day, 4, DepartureDate)
        WHERE DepartureCode LIKE 'PPAF%'
        AND   ProductID = 2359

    IF @starttrancount = 0 
        COMMIT TRANSACTION
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 AND @starttrancount = 0 
        ROLLBACK TRANSACTION
    PRINT 'Error: ' + ERROR_MESSAGE()
END CATCH

【讨论】:

    【解决方案2】:

    测试@@TRANCOUNT 变量 - 在事务之前 - 如果它 > 0 - 则有一个外部事务正在进行中。所以 - 在这种情况下,您的提交只是减少 @@TRANCOUNT 的值,并没有实际提交更改

    只有最外部的提交(将 @@trancount 减为 0)才能修复更改

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多