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()以反映出存在问题.我究竟做错了什么?
所需的功能是,如果违反约束,整个事务将失败并回滚.
在你使用的时候
Set Xact_Abort On
Run Code Online (Sandbox Code Playgroud)
我的理解是,当您到达任何Catch部分时,事务已经回滚.没有什么可以回滚的.
还有一些我似乎记得的事情,有时候这样的实例会完全绕过Catch.