自動認可交易

自動認可模式是 SQL Server Database Engine 的預設交易管理模式。每一個 Transact-SQL 陳述式都會在完成時認可或回復。陳述式如果成功地完成便被認可;若是遇到任何錯誤則被復原。只要這個預設模式沒有被外顯交易或隱含交易覆寫,Database Engine 執行個體的連接都會在自動認可模式下操作。自動認可模式也是 ADO、OLE DB、ODBC 與資料程式庫的預設模式。

Database Engine 執行個體的連接會在自動認可模式之下操作,直到 BEGIN TRANSACTION 陳述式啟動明確交易,或設定開啟隱含交易為止。當認可或回復外顯交易,或是關閉隱含交易模式時,連接便回到自動認可模式。

當設為 ON 時,SET IMPLICIT_TRANSACTIONS 會將連接設為隱含的交易模式。當設為 OFF 時,它會使連接返回自動認可交易模式。

編譯與執行時期錯誤

在自動認可模式中,有時 Database Engine 執行個體會好像已將整個批次回復,而非只有一個 SQL 陳述式。這種情形只有遇到編譯錯誤時才會發生,執行階段錯誤則不會。編譯錯誤會讓 Database Engine 無法建立執行計畫,因此批次中的任何陳述式都不會執行。雖然產生錯誤的陳述式之前的所有陳述式都會回復,但錯誤會讓批次中的一切都不會執行。在下列範例中,位於第三個批次的 INSERT 陳述式由於編譯錯誤而全部不執行。前兩個 INSERT 陳述式由於並未執行而復原。

USE AdventureWorks2008R2;
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBatch VALUSE (3, 'ccc');  -- Syntax error.
GO
SELECT * FROM TestBatch;  -- Returns no rows.
GO

在下列範例中,第三個 INSERT 陳述式會產生執行階段重複的主索引鍵錯誤。前兩個 INSERT 陳述式會成功並且受到認可,因此它們在執行階段錯誤之後仍會保留。

USE AdventureWorks2008R2;
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBatch VALUES (1, 'ccc');  -- Duplicate key error.
GO
SELECT * FROM TestBatch;  -- Returns rows 1 and 2.
GO

Database Engine 會使用延遲的名稱解析,直到執行時間才會解析物件名稱。在下列範例中,前兩個 INSERT 陳述式會執行並認可,且這兩個資料列會在參考到不存在的資料表而產生執行階段錯誤的第三個 INSERT 陳述式之後,仍然留在 TestBatch 資料表。

USE AdventureWorks2008R2;
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBch VALUES (3, 'ccc');  -- Table name error.
GO
SELECT * FROM TestBatch;  -- Returns rows 1 and 2.
GO

請參閱

概念