gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:21:52 27 4
gpt4 key购买 nike

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

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() 以反射(reflect)存在问题。我究竟做错了什么?

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

最佳答案

当你使用

Set Xact_Abort On

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

我似乎还记得,有时这样的实例会完全绕过 Catch。

关于sql - 违反唯一约束后事务仍然提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32652790/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com