提交事务后更新表,但是如果更新失败,则需要回滚更新和提交插入

时间:2019-04-04 04:16:28

标签: sql-server stored-procedures transactions sql-update sql-insert

我有一个C#应用程序,允许用户提交申请表。该应用程序询问父母姓名以及他们是否结婚。提交后,将为每个父母创建一个新的用户记录。如果父母已结婚,则需要使用另一父母的ID更新每个新用户记录中的SpouseID字段。请参见下面的示例表:

ID  FirstName  LastName  SpouseID
---------------------------------
1   John       Smith     2
2   Jenny      Smith     1
3   Jim        Jackson   NULL

当前,我的代码包含在begin try语句中,因此在提交insert语句之前,无法使用新创建的用户ID更新SpouseID字段。我可以在COMMIT TRANSACTION语句之后移动将更新SpouseID字段的语句,但是如果更新SpouseID字段存在问题,我仍然希望能够回滚所有内容。

这可能吗?任何有关如何解决此问题的想法将不胜感激。

我提供了存储过程代码的简化版本。

SET XACT_ABORT ON

BEGIN TRY

    SET @OuterTransFlag = @@TRANCOUNT

    IF @OuterTransFlag = 0 
        BEGIN TRANSACTION

            IF (@UserIDP1 = 0) 
                BEGIN
                    INSERT INTO Users (Surname, Given1)
                    SELECT ISNULL(Surname, ''), ISNULL(GivenName, '')
                    FROM ParentInfo_Processed
                    WHERE CODE = @Code 

                    SET @Parent1ID = SCOPE_IDENTITY()
                END 

            IF (@UserIDP2 = 0) 
                BEGIN
                    INSERT INTO Users (Surname, Given1)
                    SELECT ISNULL(Surname, ''), ISNULL(GivenName, '')
                    FROM ParentInfo_Processed
                    WHERE CODE = @Code 

                    SET @Parent2ID = SCOPE_IDENTITY()
                END 

        IF (@ParentStatus = 'M')
            BEGIN                                           
                UPDATE Users 
                SET SpouseID = @Parent1ID 
                WHERE ID = @Parent2ID   

                UPDATE Users 
                SET SpouseID = @Parent2ID
                WHERE ID = @Parent1ID   
            END

    IF @OuterTransFlag = 0 AND @@TRANCOUNT <> 0
        COMMIT TRANSACTION

END TRY

BEGIN CATCH
    DECLARE @em VARCHAR(2000)
    SET     @em = ERROR_MESSAGE()

    IF @OuterTransFlag = 0 AND @@TRANCOUNT <> 0
        ROLLBACK TRANSACTION

    IF ISNULL(@em, '') <> ''
        RAISERROR(@em, 16, 1)
        RETURN(-1)
END CATCH

0 个答案:

没有答案