共用方式為


IMPLICIT_TRANSACTIONS (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics分析平台系統(PDW)Microsoft Fabric 中的倉庫Microsoft Fabric 中的 SQL 資料庫

將連線模式設 BEGIN TRANSACTION隱式模式。

Transact-SQL 語法慣例

語法

SET IMPLICIT_TRANSACTIONS { ON | OFF }

備註

ON時,系統處於 隱式 交易模式。 這表示若 @@TRANCOUNT = 0,以下任一 Transact-SQL 語句皆可開始新交易。 這相當於一個看不見 BEGIN TRANSACTION 的人先被處決:

  • ALTER TABLE
  • BEGIN TRANSACTION
  • CREATE
  • DELETE
  • DROP
  • FETCH
  • GRANT
  • INSERT
  • MERGE
  • OPEN
  • REVOKE
  • SELECT (見 說明說明
  • TRUNCATE TABLE
  • UPDATE

OFF時,前述的每個 T-SQL 語句都被一個未見 BEGIN TRANSACTION 語句和一個未見 COMMIT TRANSACTION 語句所界定。 當 OFF時,我們說交易模式是 自動提交。 如果你的 T-SQL 程式碼明顯發出 , BEGIN TRANSACTION我們就說交易模式是 明確的

下列是幾個要了解的說明要點:

  • 當交易模式是隱含的時,若@@TRANCOUNT > 0已經存在,則不會發出未見BEGIN TRANSACTION的。 然而,任何明確 BEGIN TRANSACTION 陳述仍然會遞 @@TRANCOUNT增 。

  • 當你 INSERT 的帳單和工作單位的其他事項完成後,你必須持續發 COMMIT TRANSACTION 帳款,直到 @@TRANCOUNT 減回0為止。 或者你可以發一張。ROLLBACK TRANSACTION

  • SELECT 不從資料表選擇的語句不會啟動隱含交易。 例如, SELECT GETDATE();SELECT 1, 'ABC'; 不要求交易。

  • 隱易可能 ON 因ANSI違約而意外發生。 詳情請參見 SET ANSI_DEFAULTS

    設定 IMPLICIT_TRANSACTIONS 為 不 ON 受歡迎。 大多數情況下,是IMPLICIT_TRANSACTIONSON因為 SET ANSI_DEFAULTS ON 被設定了。

  • SQL Server 原生客戶端 OLE DB 提供者用於 SQL Server 與 SQL Server 原生客戶端 ODBC 驅動程式,會在連接時自動設定IMPLICIT_TRANSACTIONS為 。OFF 預設 IMPLICIT_TRANSACTIONS 為 與 OFF SQLClient 管理提供者的連線,以及透過 HTTP 端點接收的 SOAP 請求。

要查看目前的 IMPLICIT_TRANSACTIONS設定,請執行以下查詢。

DECLARE @IMPLICIT_TRANSACTIONS AS VARCHAR (3) = 'OFF';
IF ((2 & @@OPTIONS) = 2)
SET @IMPLICIT_TRANSACTIONS = 'ON';
SELECT @IMPLICIT_TRANSACTIONS AS IMPLICIT_TRANSACTIONS;

範例

下列 Transact-SQL 指令碼執行幾個不同的測試案例。 也提供文字輸出,其中顯示每個測試案例的詳細行為與結果。

-- Preparations.
SET NOCOUNT ON;
SET IMPLICIT_TRANSACTIONS OFF;
GO
WHILE (@@TRANCOUNT > 0) COMMIT TRANSACTION;
GO
IF (OBJECT_ID(N'dbo.t1',N'U') IS NOT NULL) DROP TABLE dbo.t1;
GO
CREATE table dbo.t1 (a INT);
GO

PRINT N'-------- [Test A] ---- OFF ----';
PRINT N'[A.01] Now, SET IMPLICIT_TRANSACTIONS OFF.';
PRINT N'[A.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS OFF;
GO
INSERT INTO dbo.t1 VALUES (11);
INSERT INTO dbo.t1 VALUES (12);
PRINT N'[A.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

PRINT N' ';
PRINT N'-------- [Test B] ---- ON ----';
PRINT N'[B.01] Now, SET IMPLICIT_TRANSACTIONS ON.';
PRINT N'[B.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS ON;
GO
INSERT INTO dbo.t1 VALUES (21);
INSERT INTO dbo.t1 VALUES (22);
PRINT N'[B.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
COMMIT TRANSACTION;
PRINT N'[B.04] @@TRANCOUNT, after COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

PRINT N' ';
PRINT N'-------- [Test C] ---- ON, then BEGIN TRAN ----';
PRINT N'[C.01] Now, SET IMPLICIT_TRANSACTIONS ON.';
PRINT N'[C.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS ON;
GO
BEGIN TRANSACTION;
INSERT INTO dbo.t1 VALUES (31);
INSERT INTO dbo.t1 VALUES (32);
PRINT N'[C.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
COMMIT TRANSACTION;
PRINT N'[C.04] @@TRANCOUNT, after a COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
PRINT N'[C.05] @@TRANCOUNT, after another COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

PRINT N' ';
PRINT N'-------- [Test D] ---- ON, INSERT, BEGIN TRAN, INSERT ----';
PRINT N'[D.01] Now, SET IMPLICIT_TRANSACTIONS ON.';
PRINT N'[D.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS ON;
GO
INSERT INTO dbo.t1 VALUES (41);
BEGIN TRANSACTION;
INSERT INTO dbo.t1 VALUES (42);
PRINT N'[D.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
COMMIT TRANSACTION;
PRINT N'[D.04] @@TRANCOUNT, after a COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
PRINT N'[D.05] @@TRANCOUNT, after another COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

-- Clean up.
SET IMPLICIT_TRANSACTIONS OFF;
GO
WHILE (@@TRANCOUNT > 0) COMMIT TRANSACTION;
GO
DROP TABLE dbo.t1;
GO

接下來是前述 Transact-SQL 指令碼的文字輸出。

-------- [Test A] ---- OFF ----
[A.01] Now, SET IMPLICIT_TRANSACTIONS OFF.
[A.02] @@TRANCOUNT, at start, == 0
[A.03] @@TRANCOUNT, after INSERTs, == 0

-------- [Test B] ---- ON ----
[B.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[B.02] @@TRANCOUNT, at start, == 0
[B.03] @@TRANCOUNT, after INSERTs, == 1
[B.04] @@TRANCOUNT, after COMMIT, == 0

-------- [Test C] ---- ON, then BEGIN TRAN ----
[C.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[C.02] @@TRANCOUNT, at start, == 0
[C.03] @@TRANCOUNT, after INSERTs, == 2
[C.04] @@TRANCOUNT, after a COMMIT, == 1
[C.05] @@TRANCOUNT, after another COMMIT, == 0

-------- [Test D] ---- ON, INSERT, BEGIN TRAN, INSERT ----
[D.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[D.02] @@TRANCOUNT, at start, == 0
[D.03] @@TRANCOUNT, after INSERTs, == 2
[D.04] @@TRANCOUNT, after a COMMIT, == 1
[D.05] @@TRANCOUNT, after another COMMIT, == 0