为什么事务在第一个失败时插入2个值?

时间:2019-05-25 18:16:49

标签: sql-server tsql transactions

我有这张桌子:

   No     ID itemNum
0   1  A7855   item1
1   2          item2
2   3  A7856   item3
3   4          item4
4   5          item5

我在表中有一行(1,2)。现在,我想插入一些其他值,并在事务中执行该操作。我用这个:

TableAB
{
    IDTableA;
    IDTableB;
}

在第一个插入中出现完整性错误,但是在第二个和第三个插入中,将值插入表中。

我如何使用交易,但第一个交易失败,为什么要插入其他两行?我以为在事务中,如果某事失败,那么一切都将中止。那么在这种情况下,使用事务和不使用事务有什么区别?

谢谢。

3 个答案:

答案 0 :(得分:2)

我认为您应该将内容包装在tags中。

TRY...CATCH

答案 1 :(得分:1)

您需要使用TRYCATCH,在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

答案 2 :(得分:1)

尝试一下:

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