У меня есть хранимая процедура, которая находится в этом формате (упрощенный):сделка по-прежнему совершает после нарушения ограничения уникальности
SET XACT_ABORT ON
GO
BEGIN TRY
BEGIN TRANSACTION myTransaction
--multiple CRUD operations
--insert statement inserts records into table with unique constraint.
IF (XACT_STATE()) = 1
BEGIN
COMMIT TRANSACTION myTransaction
RAISERROR ('TRANSACTION COMMITTED', 0, 1) WITH NOWAIT
RETURN 1
END
END TRY
BEGIN CATCH
IF (XACT_STATE()) = -1
BEGIN
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
ROLLBACK TRANSACTION myTransaction
RAISERROR ('TRANSACTION ROLLED BACK', 0, 1) WITH NOWAIT
RETURN 0
END
IF (XACT_STATE()) = 1
BEGIN
COMMIT TRANSACTION myTransaction
RAISERROR ('TRANSACTION COMMITTED', 0, 1) WITH NOWAIT
RETURN 1
END
END CATCH
Я пытаюсь решить проблему, где SP пытается вставлять записи в таблицу с уникальным ограничением, и он терпит неудачу, поэтому он ничего не вставляет. Проблема в том, что это, похоже, не вызывает блокировку catch или не изменяет XACT_STATE(), чтобы отразить, что есть проблема. Что я делаю не так?
Желаемая функциональность заключалась бы в том, что если ограничение будет нарушено, вся транзакция завершится неудачно и будет отброшена.
Почему вы добавляете механизм фиксации в блок catch? –
Потому что, насколько я понимаю, существуют сценарии, в которых транзакция находится в состоянии commitable, но будет блокирован блок catch. Я не могу вспомнить, где я получил эту информацию, или какой сценарий может вызвать это. Я прочитал его в Интернете, который, как вы знаете, непогрешимый. – Jon