gpt4 book ai didi

sql - 触发器中的事务处理 (TRY/CATCH....XACT_ABORT ON)

转载 作者:行者123 更新时间:2023-12-04 16:14:25 29 4
gpt4 key购买 nike

我在 SQL Server 2008R2 上有流程场景:

• 一个用于收集数据然后在两个 SQL Server 之间传输数据的 usp

此过程将在流程的所有级别(usp、SSIS 和触发器)上使用事务完成

enter image description here

在将数据传输到 DB7.dbo.Dest 的数据流中,该表有一个 AFTER INSERT 触发器,它将刚刚通过的数据插入到最终表 DB7.dbo.FinalDestination 中:

CREATE TRIGGER [dbo].[Insert_OnStaging] ON [dbo].[Dest]
AFTER INSERT, UPDATE
AS
BEGIN

SET NOCOUNT ON;
SET XACT_ABORT ON; --Rollsback complete transaction if there are any errors

BEGIN TRY

BEGIN TRANSACTION

INSERT INTO [DB7].[dbo].[FinalDestination] WITH (TABLOCK)
(Column1
,Column2
)
SELECT I.Column1, I.Column2
FROM INSERTED I
INNER JOIN [DB7].[dbo].[Dest] PR
ON I.IDcol = PR.IDcol

COMMIT TRANSACTION

END TRY

BEGIN CATCH
IF @@TRANCOUNT > 0 AND XACT_STATE() <> 0
ROLLBACK TRANSACTION;

DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
DECLARE @ErrorLine INT;

SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE(),
@ErrorLine = ERROR_LINE()
;

RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState, -- State.
@ErrorLine --Error Line
);
END CATCH;
END

在每个级别,由于数据的敏感性正确且完全进入决赛 table ,我试图对数据进行防御。

关于 SSIS,从我阅读和测试的内容来看,它似乎工作正常。

我最关心的是我上面编写的触发器。根据我的阅读和理解,如果有任何错误(换句话说,存在不可提交的事务),设置 XACT_ABORT ON 将回滚 TRY 块内的事务。在这种情况下,我继续在 CATCH 块中添加回滚事务部分作为一个想法,因为它永远不会到达(根据我的理解)。同时,我添加了 WITH (TABLOCK) 选项,以便在执行 INSERT 时锁定表。

在触发器的情况下,在 XACT_ABORT 处于 ON 的情况下,TRY...CATCH 是否是必要的?在 TRY 块内是否需要 COMMIT TRANSACTION?正如我也看到它在基于@@TRANCOUNT 的 CATCH 块之后提交
BEGIN TRY
BEGIN TRANSACTION
[Tsql here]
END TRY
BEGIN CATCH
[Error Handling]
END CATCH
IF @@TRANCOUNT > 0
COMMIT TRANSACTION
END

欢迎回答和批评,并在此先感谢您。请原谅任何错别字,因为我试图概括这些名称......

最佳答案

您需要 TRY..CATCH即使您正在使用 XACT_ABORT . XACT_ABORT中止 tran 但继续运行批处理/程序!这是非常非常恶劣的行为。这意味着 DML/DDL 在发生错误后仍然可以运行,但在事务之外,因此您永远无法回滚它。

除了 TRY..CATCH,SQL Server 没有任何机制可以避免这种情况。 .我不确定是什么 XACT_ABORT永远是有益的。在你的例子中,它也没有帮助也没有伤害。

是的,您可以移动 COMITTRY如果你想。只要确保与 BEGIN TRAN 正确平衡它.

关于sql - 触发器中的事务处理 (TRY/CATCH....XACT_ABORT ON),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16173544/

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