我有这样的交易,我有几个问题。
如果我在“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
答案 0 :(得分:6)
我猜想当表不存在时,在解析/编译代码并且从不执行代码时会发生错误,因此没有要回滚的事务。
当表存在时,必须执行代码并启动事务。然后该错误导致回滚。