Share via


SET IMPLICIT_TRANSACTIONS (Transact-SQL)

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

主題連結圖示Transact-SQL 語法慣例

語法

SET IMPLICIT_TRANSACTIONS { ON | OFF }

備註

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

當連接為隱含的交易模式,且目前不在交易中時,執行下列任何一個陳述式會啟動一項交易:

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 的設定是在執行階段進行設定,而不是在剖析階段進行設定。

範例

下列範例會示範將 IMPLICIT_TRANSACTIONS 設為 ON 來明確和隱含啟動的交易。它利用 @@TRANCOUNT 函數來示範開啟或關閉的交易。

USE AdventureWorks;
GO
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 tran.
COMMIT TRANSACTION;
GO