我看到了类似的问题,但没有人能帮我解决我的问题. 所以,问题是这样的: 我有以下声明:

BEGIN TRANSACTION
        print @@TRANCOUNT
        EXECUTE proc1
        print @@TRANCOUNT
COMMIT TRANSACTION

CREATE PROCEDURE proc1 AS
BEGIN
       SET XACT_ABORT ON
       SAVE TRANSACTION TillOuterMost;
       BEGIN TRANSACTION 
       print @@TRANCOUNT
       ROLLBACK TRANSACTION TillOuterMost;
END
GO

运行此命令时,我遇到错误:

1
2
Msg 266, Level 16, State 2, Procedure proc1, Line 0 [Batch Start Line 12]
Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 2.
2

这意味着ROLLBACK TRANSACTION TillOuterMost;语句没有减少事务计数.后来,我try 只删除已保存的标签和刚使用的ROLLBACK事务.但这会同时回滚内部和外部事务,并给出以下错误:

1
2
Msg 266, Level 16, State 2, Procedure proc1, Line 0 [Batch Start Line 11]
Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0.
0
Msg 3902, Level 16, State 1, Line 18
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

请注意,在后一种情况下,事务计数已递减到0.

我也试过这个变种,它也没有帮助:

    CREATE PROCEDURE proc1 AS
    BEGIN
       SET XACT_ABORT ON
       SAVE TRANSACTION OO
       BEGIN TRANSACTION 
       print @@TRANCOUNT
       ROLLBACK TRAN OO;
    END
    GO

BEGIN TRANSACTION AA
        print @@TRANCOUNT
        EXECUTE proc1
        if @@TRANCOUNT > 0
        BEGIN
            ROLLBACK TRANSACTION AA;
        END
        ELSE
        BEGIN
           COMMIT TRANSACTION AA
        END

仍收到错误:

1
2
Msg 266, Level 16, State 2, Procedure proc1, Line 0 [Batch Start Line 12]
Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 2.

你知道如何解决这个问题吗?

推荐答案

每一个行为也必须有一个结束,在你的情况下是一个promise

CREATE PROCEDURE proc1 AS
BEGIN
       SET XACT_ABORT ON
       SAVE TRANSACTION TillOuterMost;
       BEGIN TRANSACTION 
       print @@TRANCOUNT
       ROLLBACK TRANSACTION TillOuterMost;
       COMMIT
END
BEGIN TRANSACTION
        print @@TRANCOUNT
        EXECUTE proc1
        print @@TRANCOUNT
COMMIT TRANSACTION




1
2
1

fiddle

Sql相关问答推荐

SQL计数所有值在联接范围内的行

使用SQL/R循环查找邻居

当有空单元格时,如何连接列

SQL查询每个客户的最新条目

对表进行多项 Select 以返回最大值和时间

按分类标准检索记录

如何用客户名称计算sum(dr)和sum(cr)

改进的SQL子字符串提取

无法访问级联删除导致的触发器中已删除的外键记录

通过UPDATE SELECT更新表时出现问题

Netezza SQL:判断两个表是否相同

用替代方案替换 SQL Cursor 以提高性能

匹配 H[0-9][0-9] 但不匹配除字母 H 之外的任何字母

SQL Select 字母范围没有给我任何东西

INSERT INTO 语法

Postgres如何在一个日历周中前进和回填值

自动生成计算频率的列

当该日期的至少两条记录具有相同的持续时间或至少一条记录的持续时间为 0 时,如何标记该日期的所有记录

编写查询以根据级别 (p2) 返回父位置

SELECT 用于 Parent、Children 和 ORDER BY [Order] 列