共用方式為


SET IMPLICIT_TRANSACTIONS (Transact-SQL)

設定連接的隱含交易模式。

適用於:SQL Server (SQL Server 2008 至目前版本)、Windows Azure SQL 資料庫 (初始版本至目前版本)。

主題連結圖示 Transact-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

請參閱

參考

ALTER TABLE (Transact-SQL)

BEGIN TRANSACTION (Transact-SQL)

CREATE TABLE (SQL Server)

DELETE (Transact-SQL)

DROP TABLE (Transact-SQL)

FETCH (Transact-SQL)

GRANT (Transact-SQL)

INSERT (Transact-SQL)

OPEN (Transact-SQL)

REVOKE (Transact-SQL)

SELECT (Transact-SQL)

SET 陳述式 (Transact-SQL)

SET ANSI_DEFAULTS (Transact-SQL)

@@TRANCOUNT (Transact-SQL)

TRUNCATE TABLE (Transact-SQL)

UPDATE (Transact-SQL)