使用xact_abort ON
?
目前,当我使用已启动的外部事务来执行此存储过程时。
begin tran
exec TestFK 2
我得到这个隐藏实际错误的通用错误
当前事务无法提交,也无法支持写入日志文件的操作。回滚交易。
但是当我没有外部交易时执行
exec TestFK 2
我得到了正确的错误。
INSERT语句与FOREIGN KEY约束冲突" FK__t2__a__3B783965"。冲突发生在数据库" XXX",表" dbo.t1",列' a'。
ALTER procedure [dbo].[TestFK]
@Id int
as
begin
SET NOCOUNT ON
SET xact_abort ON
DECLARE @trancount INT
SET @trancount = @@TRANCOUNT
begin try
IF @trancount = 0
BEGIN TRANSACTION
INSERT INTO t2 VALUES (@Id); -- Foreign key error for @Id = 2
IF @trancount = 0
COMMIT TRANSACTION
end try
begin catch
IF Xact_state() <> 0 AND @trancount = 0
ROLLBACK TRANSACTION
Exec uspInsErrorInfo -- Here I want to preserve the Error State somehow
end catch
END
CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY);
CREATE TABLE t2 (a INT NOT NULL REFERENCES t1(a));
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (6);
答案 0 :(得分:0)
因此,我使用的解决方案是在这种情况下简单地删除try / catch块。
当SET XACT_ABORT为ON时,如果Transact-SQL语句引发了 运行时错误,整个事务终止并回滚。
ALTER procedure [dbo].[TestFK]
@Id int
as
begin
SET NOCOUNT ON
SET xact_abort ON
DECLARE @trancount INT
SET @trancount = @@TRANCOUNT
IF @trancount = 0
BEGIN TRANSACTION
INSERT INTO t2 VALUES (@Id); -- Foreign key error for @Id = 2
-- + some other statements
IF @trancount = 0
COMMIT TRANSACTION
END