2013-04-25 81 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