Обновление таблицы после фиксации транзакции, но необходимо откатить обновление и зафиксированную вставку, если обновление не удалось - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть приложение на C #, которое позволяет пользователям отправлять форму заявки.Приложение запрашивает имена родителей и если они состоят в браке.После отправки для каждого родителя создается новая запись пользователя.Если родители состоят в браке, мне нужно обновить поле SpouseID в каждой новой записи пользователя, указав идентификатор другого родителя.См. Пример таблицы ниже:

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

В настоящее время мой код обернут в оператор начала попытки, поэтому я не могу обновить поле SpouseID с помощью вновь созданных идентификаторов пользователей, пока оператор вставки не будет принят.Я могу переместить оператор, чтобы обновить поля SpouseID после оператора COMMIT TRANSACTION, но я все еще хочу иметь возможность откатить все, если есть проблема с обновлением полей 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
...