次の方法で共有


セットIMPLICIT_TRANSACTIONS(Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (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明細書や作業単位内のその他の事項が終わったら、@@TRANCOUNTが0に戻るまでCOMMIT TRANSACTION明細書を発行しなければなりません。 あるいは1 ROLLBACK TRANSACTION発行することもできます。

  • SELECT テーブルから選択しない文は暗黙のトランザクションを開始しません。 例えば、 SELECT GETDATE();SELECT 1, 'ABC'; は取引を必要としません。

  • 暗黙の取引はANSIのデフォルトにより予期せず、予期せずも ON されることがあります。 詳細は SET ANSI_DEFAULTSを参照してください。

    IMPLICIT_TRANSACTIONSONに設定するのはあまり人気がありません。 IMPLICIT_TRANSACTIONSONする多くの場合、それは設定SET ANSI_DEFAULTS ONからです。

  • SQL ServerネイティブクライアントのOLE DBプロバイダーとSQL ServerネイティブクライアントのODBCドライバーは、接続時に自動的に IMPLICIT_TRANSACTIONSOFF に設定されます。 SQLClient管理プロバイダーとの接続およびHTTPエンドポイント経由で受信したSOAPリクエストに対して、デフォルトIMPLICIT_TRANSACTIONSOFFに設定します。

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