Я нашел статью в 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)
Какой рекомендуемый способ обработки ошибок, возникающих, когда объект не существует, особенно когда есть транзакция. Следует ли мне использовать этот фрагмент кода вместо двух последних операторов печати:
IF @@ERROR <> 0 AND @@TRANCOUNT > 0
BEGIN
PRINT 'Rolling back txn'
ROLLBACK TRANSACTION
END
go
PRINT 'Transaction Count again: ' + CAST(@@TRANCOUNT AS VARCHAR)