首页 > 解决方案 > 我们可以跳过回滚到特定表并在 SQL 事务中回滚其他表吗

问题描述

我有一个类似于下面的存储过程

CREATE PROC Usp_InsertData(@ID INT, @Name varchar(max))
    AS
    BEGIN TRY
    BEGIN TRANSACTION

    INSERT INTO Employee1(ID,[Name]) VALUES(@ID,@Name);

    INSERT INTO Employee2(ID,[Name]) VALUES(@ID,@Name);

    INSERT INTO Employee3(ID,[Name]) VALUES(@ID,@Name);

    INSERT INTO Employee4(ID,[Name]) VALUES(@ID,@Name);

   COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
    ROLLBACK TRANSACTION

    END CATCH

我的要求是,如果发生任何问题,则应调用 catch 回滚。并且这种回滚应该只发生在 Employee2、Employee3、Employee4 跳过 Employee1 表上。

最后,我将只在 Employee1 和其他实现的回滚中拥有数据。

有没有办法从事务回滚中跳过特定表

更新1:

我正在从主 SP 调用 SP 上方,如下所示。因此,即使主 SP 事务失败,除 Employee1 之外的所有更改都需要回滚。

CREATE PROC Usp_MasterInsertData(@ID INT,@Name varchar(max))
AS
BEGIN TRY
BEGIN TRANSACTION

EXEC Usp_InsertData @ID,@Name --In this SP, I want to skip rollback to Employee1 table.

EXEC Usp_UpdateData @ID,@Name

COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION


END CATCH

标签: sqlsql-server

解决方案


在第一次插入之后添加事务,如

 CREATE PROC Usp_InsertData(@ID INT, @Name varchar(max))
        AS


        INSERT INTO Employee1(ID,[Name]) VALUES(@ID,@Name); 

        BEGIN TRY  
        BEGIN TRANSACTION

        INSERT INTO Employee2(ID,[Name]) VALUES(@ID,@Name);

        INSERT INTO Employee3(ID,[Name]) VALUES(@ID,@Name);

        INSERT INTO Employee4(ID,[Name]) VALUES(@ID,@Name);

       COMMIT TRANSACTION
        END TRY
        BEGIN CATCH
        ROLLBACK TRANSACTION

        END CATCH

推荐阅读