【问题标题】:What happens here? SQL Server - XACT_ABORT ON + @@ERROR Checking . .这里会发生什么? SQL Server - XACT_ABORT ON + @@ERROR 检查。 .
【发布时间】:2011-05-11 19:17:23
【问题描述】:

这种情况会发生什么?

SET XACT_ABORT ON

BEGIN TRANSACTION

    ---DO SOMETHING HERE THAT CAUSES AN ERROR

COMMIT TRANSACTION

if @@error != 0
raiserror('SP failed. Step 7.', 20, -1) with log GO

我的猜测是,因为XACT_ABORTON,所以COMMIT TRANSACTION 永远不会发生(因为整个事情都回滚并终止了),最后一条语句也不会发生(检查@@error 然后调用@987654326 @)。

【问题讨论】:

    标签: sql-server transactions raiseerror xact-abort


    【解决方案1】:

    正确。

    SET XACT_ABORT 跳出批处理。您的 IF 属于同一批次。

    如果您想对错误进行一些处理,请使用 BEGIN TRY 等

    SET XACT_ABORT ON
    BEGIN TRY
    BEGIN TRANSACTION
    
        ---DO SOMETHING HERE THAT CAUSES AN ERROR
    
    COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        raiserror('SP failed. Step 7.', 20, -1) with log
    END CATCH
    GO
    

    我也对严重性 20 很感兴趣,因为它会中断连接。通常你会使用 16,这是用户定义的错误。

    【讨论】:

    • @gbn:谢谢。因为那是在 try...catch...如果之后有语句,它们将执行,对吗?如果他们这样做,他们会以同样的方式对 xact_abort 做出反应,即。 xact_abort 是否适用于 SP 中的每笔交易?还是只是第一个?我知道这听起来像是一个愚蠢的问题,但我只是想确定一下。
    • 只是为了澄清。 . .如果没有 try/catch,整个事情就会终止,之后不会执行任何语句。使用 try/catch,它只会中止该事务,然后继续执行下一条语句?
    • XACT_ABORT ON 适用于整个范围/批次。这是一个存储过程。是的,CATCH 执行后的代码
    • 对于您的第二条评论:您需要 TRY/CATCH 来实现 predictable 行为,这意味着“像我期望的那样处理错误”。如果没有 T/C,你会得到它是“批量中止”,这意味着“不再运行代码”
    • @gbn:谢谢!严重性 20,因为我希望一切都停止。这是一个数据仓库事务导入SP,如果出现错误,我想回滚到数据库的先前状态。我不想要任何半更新。有什么建议么?我应该做其他事情而不是严重性 20 吗?
    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多