SET IMPLICIT_TRANSACTIONS (Transact-SQL)
接続に対して暗黙のトランザクション モードを設定します。
構文
SET IMPLICIT_TRANSACTIONS { ON | OFF }
説明
SET IMPLICIT_TRANSACTIONS が ON の場合は、接続は暗黙のトランザクション モードに設定されます。 OFF の場合、接続は自動コミット トランザクション モードに戻ります。 ANSI_DEFAULTS が原因で IMPLICIT_TRANSACTIONS が予期せず ON になっている可能性があります。 IMPLICIT_TRANSACTIONS = ON の場合、明示的な BEGIN TRANSACTION によって 2 つの入れ子構造のトランザクションが開始されます。
接続が暗黙のトランザクション モードで、トランザクションに現在接続がない場合は、次のいずれかのステートメントを実行するとトランザクションが開始されます。
ALTER TABLE |
FETCH |
REVOKE |
BEGIN TRANSACTION |
GRANT |
SELECT (以下の例外を参照) |
CREATE |
INSERT |
TRUNCATE TABLE |
DELETE |
OPEN |
UPDATE |
DROP |
接続が既に、開いたトランザクション内にある場合は、ここに示したステートメントを実行しても新しいトランザクションは開始されません。
この設定を ON にして自動的に開いたトランザクションは、トランザクションの最後に、ユーザーが明示的にコミットまたはロールバックする必要があります。 この操作を行わないと、このトランザクションと、このトランザクションで行われたすべてのデータ変更は、ユーザーが切断するときにロールバックされます。 トランザクションがコミットされた後、ここに示したいずれかのステートメントを実行すると、新しいトランザクションが開始されます。
暗黙のトランザクション モードは、接続で SET IMPLICIT_TRANSACTIONS OFF ステートメントが実行されるまで有効です。このステートメントが実行されると、接続は自動コミット モードに戻ります。 自動コミット モードでは、個々のステートメントは正常に終了した場合にすべてコミットされます。
SQL Server Native Client OLE DB Provider for SQL Server および SQL Server Native Client ODBC ドライバーでは、接続時に自動的に IMPLICIT_TRANSACTIONS が OFF に設定されます。 SQLClient マネージ プロバイダーへの接続と、HTTP エンドポイント経由で受信した SOAP 要求に対しては、SET IMPLICIT_TRANSACTIONS は既定では OFF になります。
SET ANSI_DEFAULTS が ON の場合、SET IMPLICIT_TRANSACTIONS は ON になります。
SET IMPLICIT_TRANSACTIONS が ON の場合に BEGIN TRANSACTION ステートメントを実行すると、2 つの入れ子構造のトランザクションが開きます。 トランザクションがアクティブな場合はいつでも 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
関連項目
参照
BEGIN TRANSACTION (Transact-SQL)