Почему транзакция вставляет 2 значения, когда не удается первое? - PullRequest
0 голосов
/ 25 мая 2019

У меня есть эта таблица:

TableAB
{
    IDTableA;
    IDTableB;
}

У меня есть одна строка в таблице (1,2).Теперь я хочу вставить некоторые другие значения и сделать это в транзакции.Я использую это:

begin
insert into TableAB (IDTAbleA, IDTAbleB) VALUES(1,2);
insert into TableAB (IDTAbleA, IDTAbleB) VALUES(1,3);
insert into TableAB (IDTAbleA, IDTAbleB) VALUES(1,3);
commit

Я получаю ошибку целостности при первой вставке, но при второй и третьей вставке вставьте значения в таблицу.

Как я использую транзакциюи терпит неудачу первый, почему он вставляет другие две строки?Я думал, что внутри транзакции, если что-то не получается, все прерывается.Тогда в этом случае какая разница использовать транзакцию и не использовать ее?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 25 мая 2019

Я полагаю, вы должны обернуть вещи в TRY...CATCH.

BEGIN TRY

    BEGIN TRANSACTION InsertValues;
    INSERT INTO TableAB (IDTAbleA, IDTAbleB) VALUES(1,2);
    INSERT INTO TableAB (IDTAbleA, IDTAbleB) VALUES(1,3);
    INSERT INTO TableAB (IDTAbleA, IDTAbleB) VALUES(1,3);
    COMMIT InsertValues;

END TRY
BEGIN CATCH

    ROLLBACK InsertValues;
    THROW;

END CATCH
1 голос
/ 26 мая 2019

Попробуйте:

SET XACT_ABORT ON
BEGIN TRANSACTION;

BEGIN TRY

    INSERT INTO TableAB(IDTAbleA,IDTAbleB)VALUES(1, 2);
    INSERT INTO TableAB(IDTAbleA,IDTAbleB)VALUES(1, 3);
    INSERT INTO TableAB(IDTAbleA,IDTAbleB)VALUES(1, 3);

    COMMIT TRANSACTION;
END TRY
BEGIN CATCH

    IF @@TRANCOUNT > 0
    BEGIN

        IF (XACT_STATE()) = -1
        BEGIN
            ROLLBACK TRANSACTION;
            THROW;
        END
        ELSE IF (XACT_STATE()) = 1
        BEGIN
            COMMIT TRANSACTION;
        END;

    END;

END CATCH;

Подробнее:

XACT_ABORT : https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-2017

XACT_STATE () : https://docs.microsoft.com/en-us/sql/t-sql/functions/xact-state-transact-sql?view=sql-server-2017

@@ TRANCOUNT : https://docs.microsoft.com/en-us/sql/t-sql/functions/trancount-transact-sql?view=sql-server-2017

1 голос
/ 25 мая 2019

Вам нужно использовать TRY и CATCH, а в CATCH вам нужно ROLLBACK транзакцию, как уже упоминалось. Другой способ сделать это - SET XACT_ABORT ON следующим образом.

SET XACT_ABORT ON 

BEGIN TRAN
insert into TableAB (IDTAbleA, IDTAbleB) VALUES(1,2);
insert into TableAB (IDTAbleA, IDTAbleB) VALUES(1,3);
insert into TableAB (IDTAbleA, IDTAbleB) VALUES(1,3);
COMMIT TRAN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...