XACT_ABORT OFF ACID不兼容?

时间:2013-04-25 11:07:18

标签: sql sql-server

我是新来的,所以请保持温柔! :) 好的,所以我已经进入SQL Server社区/世界大约2年了(SQL Server Dev和DBA - 2005+版本),最近我也发现了ACID理论,我只是想知道SQL Server到底是怎么回事ACID兼容?默认情况下,它总是带有XACT_ABORT OFF选项,对吧?这是MSDN的一个例子:

    IF OBJECT_ID(N't2', N'U') IS NOT NULL
        DROP TABLE t2;
    GO
    IF OBJECT_ID(N't1', N'U') IS NOT NULL
        DROP TABLE t1;
    GO
    CREATE TABLE t1
        (a INT NOT NULL PRIMARY KEY);
    CREATE TABLE t2
        (a INT NOT NULL REFERENCES t1(a));
    GO
    INSERT INTO t1 VALUES (1);
    INSERT INTO t1 VALUES (3);
    INSERT INTO t1 VALUES (4);
    INSERT INTO t1 VALUES (6);
    GO
    SET XACT_ABORT OFF;
    GO
    BEGIN TRANSACTION;
    INSERT INTO t2 VALUES (1);
    INSERT INTO t2 VALUES (2); -- Foreign key error.
    INSERT INTO t2 VALUES (3);
    COMMIT TRANSACTION;
    GO

select * from t2;

结果集:

a
1
3

在这种情况下,原子性在哪里?我是否认为整个ACID理论错了?

PS:我问这个的原因不仅仅是因为ACID属性,而且因为我过去曾经多次使用这个XACT_ABORT选项,特别是当它通过ODBC连接与应用程序的CLR代码结合时 - 但是关于主题:)

1 个答案:

答案 0 :(得分:2)

是的,你是对的。如果这样使用,XACT_ABORT OFF并且没有TRY / CATCH块,SQL Server中的事务几乎没用。

您应始终使用XACT_ABORT_ON和TRY / CATCH块来确保您的交易安全。

在这种情况下,即使使用XACT_ABORT OFF,TRY / CATCH也可以工作:

    SET XACT_ABORT OFF;
    GO
    BEGIN TRY
        BEGIN TRANSACTION;
        INSERT INTO t2 VALUES (1);
        INSERT INTO t2 VALUES (2); -- Foreign key error.
        INSERT INTO t2 VALUES (3);
        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        ROLLBACK;
    END CATCH  
    GO