我在MSDN Lbrary中发现和文章解释说try/catch不能处理无法找到对象时抛出的错误.所以,即使我在try/catch中包装一个事务,回滚短语也不会执行:
BEGIN TRY
BEGIN TRANSACTION
SELECT 1 FROM dbo.TableDoesNotExists
PRINT ' Should not see this'
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
SELECT
ERROR_MESSAGE()
END CATCH
--PRINT 'Error Number before go: ' + CAST(@@Error AS VARCHAR)
go
PRINT 'Error Count After go: ' + CAST(@@Error AS VARCHAR)
PRINT 'Transaction Count ' + CAST(@@TRANCOUNT AS VARCHAR)
Run Code Online (Sandbox Code Playgroud)
当对象不存在时,特别是涉及事务时,建议的方法是处理抛出的错误.我应该用这一段代码代替最后两个打印语句:
IF @@ERROR <> 0 AND @@TRANCOUNT > 0
BEGIN
PRINT 'Rolling back txn'
ROLLBACK TRANSACTION
END
go
PRINT 'Transaction Count again: ' …Run Code Online (Sandbox Code Playgroud)