適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric のウェアハウス
Microsoft Fabric の SQL データベース
接続の BEGIN TRANSACTION モードを 暗黙的に設定します。
構文
SET IMPLICIT_TRANSACTIONS { ON | OFF }
解説
ON時、システムは暗黙のトランザクションモードに入ります。 つまり、 @@TRANCOUNT = 0なら、以下の Transact-SQL 文のいずれかが新しい取引を開始することを意味します。 これは見えない BEGIN TRANSACTION が最初に処刑されるのと同じです:
ALTER TABLEBEGIN TRANSACTIONCREATEDELETEDROPFETCHGRANTINSERTMERGEOPENREVOKE-
SELECT( 説明文参照) TRUNCATE TABLEUPDATE
OFF時、前の各T-SQL文は見えないBEGIN TRANSACTION文と見えないCOMMIT TRANSACTION文で境界付けられます。
OFF時はトランザクションモードをオートコミットとします。 もしあなたのT-SQLコードが BEGIN TRANSACTIONを発行しているのが見えるなら、トランザクションモードは 明示的であると言います。
理解しておくべき明確な点がいくつかあります。
トランザクションモードが暗黙的であれば、すでに
@@TRANCOUNT > 0見えないBEGIN TRANSACTIONは発行されません。 しかし、明示的なBEGIN TRANSACTION文は依然として増加@@TRANCOUNT。INSERT明細書や作業単位内のその他の事項が終わったら、@@TRANCOUNTが0に戻るまでCOMMIT TRANSACTION明細書を発行しなければなりません。 あるいは1ROLLBACK TRANSACTION発行することもできます。
SELECTテーブルから選択しない文は暗黙のトランザクションを開始しません。 例えば、SELECT GETDATE();やSELECT 1, 'ABC';は取引を必要としません。暗黙の取引はANSIのデフォルトにより予期せず、予期せずも
ONされることがあります。 詳細は SET ANSI_DEFAULTSを参照してください。IMPLICIT_TRANSACTIONSをONに設定するのはあまり人気がありません。IMPLICIT_TRANSACTIONSがONする多くの場合、それは設定SET ANSI_DEFAULTS ONからです。SQL ServerネイティブクライアントのOLE DBプロバイダーとSQL ServerネイティブクライアントのODBCドライバーは、接続時に自動的に
IMPLICIT_TRANSACTIONSをOFFに設定されます。 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
関連コンテンツ
- テーブル変更 (Transact-SQL)
- トランザクション開始(Transact-SQL)
- テーブルを作成 (Transact-SQL)
- 削除(Transact-SQL)
- DROP TABLE (Transact-SQL) (テーブルを削除するSQLコマンド)
- FETCH(Transact-SQL)
- グラント (Transact-SQL)
- 挿入(Transact-SQL)
- マージ(Transact-SQL)
- オープン(Transact-SQL)
- 取り消し (Transact-SQL)
- SELECT(Transact-SQL)
- SET ステートメント (Transact-SQL)
- セットANSI_DEFAULTS(Transact-SQL)
- @@TRANCOUNT(Transact-SQL)
- トランケートテーブル(Transact-SQL)
- 更新(Transact-SQL)