事务在违反唯一约束后仍然提交

Jon*_*Jon 3 sql t-sql sql-server

我有一个这种格式的存储过程(简化):

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
Run Code Online (Sandbox Code Playgroud)

我正在尝试解决SP尝试将记录插入具有唯一约束的表中的问题,并且它失败,因此它不会插入任何内容.问题是,这似乎没有触发catch块,或者更改XACT_STATE()以反映出存在问题.我究竟做错了什么?

所需的功能是,如果违反约束,整个事务将失败并回滚.

Rac*_*ler 6

在你使用的时候

Set Xact_Abort On
Run Code Online (Sandbox Code Playgroud)

我的理解是,当您到达任何Catch部分时,事务已经回滚.没有什么可以回滚的.

还有一些我似乎记得的事情,有时候这样的实例会完全绕过Catch.