2

我是新来的,所以请温柔!:) 好的,所以我已经进入 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 代码结合时 - 但偏离主题: )

4

1 回答 1

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
于 2013-04-25T11:16:18.600 回答