【问题标题】:Retrying query on deadlocks重试死锁查询
【发布时间】:2017-02-27 19:27:38
【问题描述】:

最近,在我们的产业中,我们注意到某些存储过程的死锁增加了,这些很简单:

  • 插入表格
  • 根据主键更新表中的记录

此表有太多触发器,这些触发器偶尔会与另一个存储过程发生冲突,该存储过程按小时运行并导致死锁。

我在谷歌上搜索并偶然发现了这篇文章:https://www.simple-talk.com/sql/database-administration/handling-deadlocks-in-sql-server/

它建议使用以下模式来处理死锁过程:

DECLARE @retries INT ;
SET @retries = 4 ;

WHILE ( @retries > 0 ) 
    BEGIN
        BEGIN TRY
            BEGIN TRANSACTION ;

         -- place sql code here
            SET @retries = 0 ;

            COMMIT TRANSACTION ;
        END TRY
        BEGIN CATCH 
        -- Error is a deadlock
            IF ( ERROR_NUMBER() = 1205 ) 
                SET @retries = @retries - 1 ;

        -- Error is not a deadlock
            ELSE 
                BEGIN
                    DECLARE @ErrorMessage NVARCHAR(4000) ;
                    DECLARE @ErrorSeverity INT ;
                    DECLARE @ErrorState INT ;

                    SELECT  @ErrorMessage = ERROR_MESSAGE() ,
                            @ErrorSeverity = ERROR_SEVERITY() ,
                            @ErrorState = ERROR_STATE() ;

                    -- Re-Raise the Error that caused the problem
                    RAISERROR (@ErrorMessage, -- Message text.
                       @ErrorSeverity, -- Severity.
                       @ErrorState -- State.
                       ) ;
                    SET @retries = 0 ;
                END

            IF XACT_STATE() <> 0 
                ROLLBACK TRANSACTION ;
        END CATCH ;
    END ;
GO 

它几乎给了代码第二次、第三次和第四次成功的机会,然后才抛出错误。

我的问题是,这是否是一种在前卫情况下处理死锁的健康模式,并且是一种实际的解决方案而不是解决问题的方法?

【问题讨论】:

    标签: sql-server deadlock database-deadlocks


    【解决方案1】:

    免责声明:这个答案只是一个意见:)

    该解决方案看起来对我有用。但是,我不认为这是一个实际的解决方案,而是一种解决方法。最好尝试找出导致死锁的原因并解决该问题。

    如果你不能解决死锁的原因,那么像这样的解决方法不会很糟糕,但实际上只是解决实际问题。

    【讨论】:

    • 这就是我自己的实际想法。现在我想消除它们并阅读更多的文学作品。一切都太纠结了,无法快速解决问题。
    猜你喜欢
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多