1

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

如果我要对'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
4

1 回答 1

6

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

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

于 2012-11-12T15:16:07.190 回答