【问题标题】:SQL Try-Catch and transactions issueSQL Try-Catch 和事务问题
【发布时间】:2012-11-12 15:12:31
【问题描述】:

我有一个这样的交易,我有几个问题。

如果我要针对“Master”运行它,它应该会出错,因为表“Year”不存在,我看不到事务回滚。 SQL 只是抛出表/列不存在的错误。

如果我对存在表的数据库运行它并由于外键约束而使其出错,那么我确实看到事务回滚。

为什么我没有得到相同的结果。

BEGIN TRY
    BEGIN TRANSACTION

    INSERT INTO Year (YearId, FiscalYear) 
    VALUES (NewId(), 2014)

    COMMIT

END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0
     ROLLBACK
        PRINT 'ERROR'

  DECLARE @ErrMsg nvarchar(4000)
        , @ErrSeverity int
  SELECT @ErrMsg = ERROR_MESSAGE(),
         @ErrSeverity = ERROR_SEVERITY()

  RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH

GO

【问题讨论】:

    标签: sql tsql transactions


    【解决方案1】:

    我猜想当表不存在时,代码被解析/编译并且从不执​​行时发生错误,所以没有事务可以回滚。

    当表存在时,必须执行代码并启动事务。然后错误导致回滚。

    【讨论】:

    • 你的猜测是正确的 :) - catch 是针对运行时错误,而不是编译时错误。
    猜你喜欢
    • 2011-02-23
    • 2011-08-26
    • 2011-11-28
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多