加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server-2008 – SQL Server – 存储过程中的嵌套事务

发布时间:2020-12-12 06:31:49 所属栏目:MsSql教程 来源:网络整理
导读:让我们说这是情况: [Stored Proc 1] BEGIN BEGIN TRANSACTION ... exec sp 2 COMMIT END 现在,如果SP 2 – 由于某种原因回滚,SP 1 – 提交或回滚还是抛出异常? 谢谢. 解决方法 SQL Server中没有自治事务.您可能会看到@@ TRANCOUNT增加到超过1,但回滚会影响
让我们说这是情况:
[Stored Proc 1]
  BEGIN
     BEGIN TRANSACTION
       ...
            exec sp 2   
     COMMIT
  END

现在,如果SP 2 – 由于某种原因回滚,SP 1 – 提交或回滚还是抛出异常?

谢谢.

解决方法

SQL Server中没有自治事务.您可能会看到@@ TRANCOUNT增加到超过1,但回滚会影响整个事情.

编辑要求指出文件.不知道明确记录的主题,但我可以在行动中向您展示.

USE tempdb;
GO

内部过程:

CREATE PROCEDURE dbo.sp2
    @trip BIT
AS
BEGIN
    SET NOCOUNT ON;

    BEGIN TRANSACTION;

    PRINT @@TRANCOUNT;

    IF @trip = 1
    BEGIN
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION;
    END
    ELSE
    BEGIN   
        IF @@TRANCOUNT > 0
            COMMIT TRANSACTION;
    END

    PRINT @@TRANCOUNT;
END
GO

外部过程:

CREATE PROCEDURE dbo.sp1
    @trip BIT
AS
BEGIN
    SET NOCOUNT ON;

    BEGIN TRANSACTION;

    PRINT @@TRANCOUNT;

    BEGIN TRY
        EXEC dbo.sp2 @trip = @trip;
    END TRY
    BEGIN CATCH
        PRINT ERROR_MESSAGE();
    END CATCH

    PRINT @@TRANCOUNT;

    IF @@TRANCOUNT > 0
        COMMIT TRANSACTION;

    PRINT @@TRANCOUNT;
END
GO

所以现在让我们调用它,让一切都提交:

EXEC dbo.sp1 @trip = 0;

结果:

1
2
1
1
0

现在让我们调用它并回滚内部过程:

EXEC dbo.sp1 @trip = 1;

结果:

120 <– notice that a rollback here rolled back both Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1,current count = 0. 00

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读