SET IMPLICIT_TRANSACTIONS (Transact-SQL)

接続に対して暗黙のトランザクション モードを設定します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

SET IMPLICIT_TRANSACTIONS { ON | OFF }

説明

SET IMPLICIT_TRANSACTIONS が ON の場合は、接続は暗黙のトランザクション モードに設定されます。OFF の場合、接続は自動コミット トランザクション モードに戻ります。

接続が暗黙のトランザクション モードで、トランザクションに現在接続がない場合は、次のいずれかのステートメントを実行するとトランザクションが開始されます。

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 は、解析時ではなく実行時に設定されます。

次の例では、明示的に開始されたトランザクションと、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