我希望得到一些澄清这个答案 - >Nested stored procedures containing TRY CATCH ROLLBACK pattern?只有在启动事务时才需要调用SET XACT_ABORT?
下面是从上面的链接
1 CREATE PROCEDURE [Name]
2 AS
3 SET XACT_ABORT, NOCOUNT ON
4
5 DECLARE @starttrancount int
6
7 BEGIN TRY
8 SELECT @starttrancount = @@TRANCOUNT
9
10 IF @starttrancount = 0
11 BEGIN TRANSACTION
12
13 [...Perform work, call nested procedures...]
14
15 IF @starttrancount = 0
16 COMMIT TRANSACTION
17 END TRY
19 BEGIN CATCH
20 IF XACT_STATE() <> 0 AND @starttrancount = 0
21 ROLLBACK TRANSACTION
22 RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
23 END CATCH
24 GO
假设它是从开始交易的传统存储过程调用的代码示例。 在这种情况下,此proc将不会启动它自己的事务,但会改变该调用的XACT_ABORT状态。
所以,我在这里有几个问题。
- 是XACT_ABORT活跃当前 PROC只,或整个调用堆栈 ?
- 如果我想重构一个proc来使用 SET XACT_ABORT ON,我需要将 与SET XACT_ABORT OFF配对吗?这是遗传代码最安全的方法吗?
下面是改性的样品,关于XACT_ABORT有条件和对转动它与将其关闭上一个PROC出口
CREATE PROCEDURE [Name]
AS
SET NOCOUNT ON
DECLARE @starttrancount int
BEGIN TRY
SELECT @starttrancount = @@TRANCOUNT
IF @starttrancount = 0
BEGIN
SET XACT_ABORT ON
BEGIN TRANSACTION
END
[...Perform work, call nested procedures...]
IF @starttrancount = 0
BEGIN
COMMIT TRANSACTION
SET XACT_ABORT OFF
END
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 AND @starttrancount = 0
BEGIN
ROLLBACK TRANSACTION
SET XACT_ABORT OFF
END
RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
GO
要检查,这是否意味着下面的答案是不正确的(即以我的阅读吉博的答案是矛盾这个答案;但都有upvotes ...假设你是正确的因为你有更高的声誉)。 – JohnLBevan 2015-09-22 19:20:35
@JohnLBevan - 是的。 – 2015-09-22 20:00:49