Наконец, пункт в транзакции SQL Server? Что-то, что будет выполняться независимо от успеха или неудачи?
В SQL Server есть что-то похожее на finally
пункт в try..catch...
блок с #?
Я имею в виду, я использую BEGIN TRAN, END TRAN, COMMIT TRAN, ROLLBACK TRAN
и т.д. в транзакции SQL Server и хотите раздел или некоторый набор действий, которые должны запускаться независимо от успеха, сбоя или транзакции.
Есть ли решение для этого? (похоже на блок finally на try/catch языков OOPS).
заранее спасибо
3 ответа
Там нет ничего, что будет работать "независимо от успеха или неудачи" со 100% надежностью. Неважно, говорите ли вы о предложении "finally" программы на C# или о структуре BEGIN TRY...END TRY BEGIN CATCH...END CATCH на SQL Server.
Проблема в том, что подобные терминальные блоки не могут работать при каждом возможном режиме отказа. Каждый возможный режим сбоя должен включать программные, аппаратные и сетевые сбои. Если вашим клиентом является правительство, оно, вероятно, должно включать и ракетные атаки.
Обязательная ссылка на классический TheDailyWTF.
На самом деле, есть BEGIN TRY... END TRY...BEGIN CATCH... END CATCH
структура в SQL Server. Я использую это довольно часто.
Вот обзор - бит выбора информации об ошибке, конечно, необязателен - делайте то, что имеет смысл в вашем случае.
BEGIN TRY
-- do something here.
/* Following line can be used to force termination for testing purposes.
No data changes will be committed.
*/
--RAISERROR('testing', 99, 1);
PRINT 'Successful completion; committing transaction.';
COMMIT TRAN;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
RAISERROR(N'Error occurred; rolling back and terminating.',18,1);
END CATCH;
Этот последний вызовет ошибку каждый раз, не так ли?
Если вы хотите перехватить ошибку отката - вам нужно также поместить ее в блок try..except.