SET IMPLICIT_TRANSACTIONS (Transact-SQL)
設定連接的隱含交易模式。
適用於:SQL Server (SQL Server 2008 至目前版本)、Windows Azure SQL 資料庫 (初始版本至目前版本)。 |
語法
SET IMPLICIT_TRANSACTIONS { ON | OFF }
備註
當設為 ON 時,SET IMPLICIT_TRANSACTIONS 會將連接設為隱含的交易模式。 當設為 OFF 時,它會使連接返回自動認可交易模式。 由於 ANSI 預設值的緣故,隱含交易可能會非預期地開啟。 當 IMPLICIT_TRANSACTIONS = ON 時,明確表示 BEGIN TRANSACTION 將會開始兩筆巢狀交易。
當連接為隱含的交易模式,且目前不在交易中時,執行下列任何一個陳述式會啟動一項交易:
ALTER TABLE |
FETCH |
REVOKE |
BEGIN TRANSACTION |
GRANT |
SELECT (請參閱底下的例外狀況)。 |
CREATE |
INSERT |
TRUNCATE TABLE |
DELETE |
OPEN |
UPDATE |
DROP |
如果連接已在開啟的交易中,這些陳述式不會啟動新的交易。
設定為 ON 會自動開啟交易,使用者必須在交易結束時,明確地加以認可或回復。 否則,當使用者中斷連接時,會回復交易和它所包含的所有資料變更。 在認可交易之後,執行上述任何一個陳述式,都會啟動一項新的交易。
隱含的交易模式會持續有效,直到連接執行 SET IMPLICIT_TRANSACTIONS OFF 陳述式為止,這個陳述式會使連接返回自動認可模式。 在自動認可模式中,如果所有個別陳述式都已順利完成,則全部都會受到認可。
SQL Server 的 SQL Server Native Client OLE DB 提供者和 SQL Server Native Client ODBC 驅動程式在連接時,都會自動將 IMPLICIT_TRANSACTIONS 設為 OFF。 對於與 SQLClient Managed 提供者的連接,以及利用 HTTP 端點來接收的 SOAP 要求,其 SET IMPLICIT_TRANSACTIONS 預設值為 OFF。
當 SET ANSI_DEFAULTS 是 ON 時,SET IMPLICIT_TRANSACTIONS 便是 ON。
當 SET IMPLICIT_TRANSACTIONS 為 ON 時執行 BEGIN TRANSACTION 陳述式會造成兩筆巢狀交易開啟。 每當交易為使用中狀態時,BEGIN_TRANSACTION 都會讓 @@trancount 遞增。
SET IMPLICIT_TRANSACTIONS 的設定是在執行階段進行設定,而不是在剖析階段進行設定。
不會從資料表中選取的 SELECT 陳述式將無法開始隱含交易。 例如,SELECT GETDATE(); 或 SELECT 1, 'ABC'; 不需要交易。
若要檢視 IMPLICIT_TRANSACTIONS 的目前設定,請執行下列查詢。
DECLARE @IMPLICIT_TRANSACTIONS VARCHAR(3) = 'OFF';
IF ( (2 & @@OPTIONS) = 2 ) SET @IMPLICIT_TRANSACTIONS = 'ON';
SELECT @IMPLICIT_TRANSACTIONS AS IMPLICIT_TRANSACTIONS;
範例
下列範例會示範將 IMPLICIT_TRANSACTIONS 設為 ON 來以明確和隱含方式啟動的交易。 它利用 @@TRANCOUNT 函數來示範開啟或關閉的交易。
SET NOCOUNT ON;
GO
SET IMPLICIT_TRANSACTIONS OFF;
GO
PRINT N'Tran count at start = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
IF OBJECT_ID(N'dbo.t1',N'U') IS NOT NULL
DROP TABLE dbo.t1;
GO
CREATE table dbo.t1 (a int);
GO
INSERT INTO dbo.t1 VALUES (1);
GO
PRINT N'Use explicit transaction.';
BEGIN TRANSACTION;
GO
INSERT INTO dbo.t1 VALUES (2);
GO
PRINT N'Tran count in explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
GO
PRINT N'Tran count after explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
PRINT N'Setting IMPLICIT_TRANSACTIONS ON.';
GO
SET IMPLICIT_TRANSACTIONS ON;
GO
PRINT N'Use implicit transactions.';
GO
-- No BEGIN TRAN needed here.
INSERT INTO dbo.t1 VALUES (4);
GO
PRINT N'Tran count in implicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
PRINT N'Tran count after implicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
PRINT N'Nest an explicit transaction with IMPLICIT_TRANSACTIONS ON.';
GO
PRINT N'Tran count before nested explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
BEGIN TRANSACTION;
PRINT N'Tran count after nested BEGIN TRAN in implicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO dbo.t1 VALUES (5);
COMMIT TRANSACTION;
PRINT N'Tran count after nested explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
-- Commit outstanding transaction.
COMMIT TRANSACTION;
GO
以下為結果集:
Tran count at start = 2
Use explicit transaction.
Tran count in explicit transaction = 3
Tran count after explicit transaction = 2
Setting IMPLICIT_TRANSACTIONS ON.
Use implicit transactions.
Tran count in implicit transaction = 2
Tran count after implicit transaction = 1
Nest an explicit transaction with IMPLICIT_TRANSACTIONS ON.
Tran count before nested explicit transaction = 1
Tran count after nested BEGIN TRAN in implicit transaction = 2
Tran count after nested explicit transaction = 1
請參閱
參考
BEGIN TRANSACTION (Transact-SQL)