我们最近被跳伞到一个新的 ETL 项目,代码非常糟糕。我手中有一个包含 700 行和各种更新的查询。
我想调试它,SET XACT_ABORT ON;
目标是在只有一个事务失败时回滚所有内容。
但我找到了几种在 StackOverflow 上存档的方法,如下所示:
BEGIN TRANSACTION;
BEGIN TRY
-- Multiple sql statements goes here
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
END CATCH
或者这个:
BEGIN TRY
BEGIN TRANSACTION
-- Multiple sql statements goes here
COMMIT TRANSACTION
END TRY
BEGIN CATCH
PRINT(ERROR_MESSAGE())
ROLLBACK TRANSACTION
END CATCH
并且没有这些用途SET XACT_ABORT ON;
。
我不明白,SET XACT_ABORT ON
和使用一样BEGIN TRY BEGIN TRANSACTION
吗?
我可以使用:
SET XACT_ABORT ON;
-- Multiple sql statements goes here
并摆脱所有:
BEGIN TRANSACTION;
BEGIN TRY
?
而且,我应该使用BEGIN TRANSACTION
然后BEGIN TRY
还是相反?