2013-04-25 79 views
2

我是新来的,所以请温柔! :) 好的,所以我现在已经进入了SQL Server社区/世界大约2年(SQL Server Dev和DBA - 2005+版本),最近我还发现了ACID理论,我只是想知道如何SQL Server ACID兼容?作为默认设置,它总是带有XACT_ABORT OFF选项,对吧?下面是从MSDN的例子:XACT_ABORT关闭ACID不兼容?

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代码结合时 - 但脱离主题:)

+0

这取决于您所期望的东西。如果您希望事务在出现错误SET XACT_ABORT ON;时中止。重要的是,你永远不会把田野写成一半。每一个陈述都是ACID。 'XACT_ABORT'设置不会改变引擎的隐藏工作,因此我们甚至不必考虑为我们避免的所有可能的不一致情况。 – Jodrell 2013-04-25 11:20:17

+0

事实上,如果ACID理论在上述情况下与SQL Server兼容,我更加好奇。我错了吗,整个Atomicity的事情?根据我所得到的,说“全部或全部”,这意味着如果一个事务失败了,它的所有内容都应该被回滚,在上面的情况下,显然它不会。而我想强调的是,XACT_ABORT默认为OFF。 – Sergiu 2013-04-25 11:22:02

+0

你说得对,默认设置为OFF,TRANSACTION语句不是原子的。它确实允许你捕捉和处理,但这是不完美的http://stackoverflow.com/a/919279/659190 – Jodrell 2013-04-25 11:25:38

回答

2

是的,你说得对。当像这样使用时,在XACT_ABORT OFF和没有TRY/CATCH块的情况下,SQL Server中的事务几乎没有用处。

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

在这种情况下,try/catch语句可以与XACT_ABORT OFF甚至工作:

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 
+0

是......真的!但我更关心ACID是如何进入SQL Server的默认设置的,因为通常情况下,默认情况下,它应该是XACT_ABORT ON以符合原子性概念,对吗? – Sergiu 2013-04-25 11:24:50

+0

@Sergiu的确,Jordell在其他评论中的链接完美解释。如果XACT_ABORT处于OFF状态,您可以选择它是一个好的交易还是不好的交易。有时候错误很小或者不相关,你仍然可以决定去做任何事情。如果你不想满ACID,你必须打开它。至于为什么微软选择了OFF默认 - 这是一个完全不同的问题:) – 2013-04-25 12:03:32