SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Warehouse in Microsoft Fabric

Legt den BEGIN TRANSACTION-Modus für die Verbindung auf implicit.

Transact-SQL-Syntaxkonventionen

Syntax

SET IMPLICIT_TRANSACTIONS { ON | OFF }  

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 (12.x) und früher finden Sie unter Dokumentation zu früheren Versionen.

Hinweise

Bei ON ist das System im implicit-Transaktionsmodus. Dies bedeutet, dass wenn @@TRANCOUNT = 0 ist, jede der folgenden Transact-SQL-Anweisungen eine neue Transaktion beginnt. Sie entspricht einer unsichtbaren BEGIN TRANSACTION-Anweisung, die zuerst ausgeführt wird:

ALTER TABLE

FETCH

REVOKE

BEGIN TRANSACTION

GRANT

SELECT (siehe die Ausnahme unten).

CREATE

INSERT

TRUNCATE TABLE

Delete

MERGE

UPDATE

DROP

OPEN

 

Bei OFF werden alle vorherigen T-SQL-Anweisungen von einer unsichtbaren BEGIN TRANSACTION- und einer unsichtbaren COMMIT TRANSACTION-Anweisung begrenzt. Bei OFF spricht man vom Transaktionsmodus autocommit. Wenn von Ihrem T-SQL-Code BEGIN TRANSACTION ausgegeben wird, spricht man vom Transaktionsmodus explicit.

Es gibt mehrere Punkte, die für das Verständnis geklärt werden müssen:

  • Bei einem impliziten Transaktionsmodus wird keine unsichtbare BEGIN TRANSACTION ausgegeben, wenn bereits @@TRANCOUNT > 0 gilt. Allerdings erhöhen alle expliziten BEGIN TRANSACTION-Anweisungen auch weiterhin @@TRANCOUNT.

  • Wenn Ihre INSERT-Anweisungen und noch etwas anderes in Ihrer Arbeitseinheit abgeschlossen ist, müssen Sie COMMIT TRANSACTION-Anweisungen ausgeben, bis @@TRANCOUNT auf 0 zurückgesetzt ist. Allerdings können Sie eine ROLLBACK TRANSACTION-Anweisung ausgeben.

  • Von SELECT-Anweisungen, die keine Daten aus einer Tabelle auswählen, werden keine impliziten Transaktionen gestartet. SELECT GETDATE(); oder SELECT 1, 'ABC'; erfordern beispielsweise keine Transaktionen.

  • Implizite Transaktionen können aufgrund von ANSI-Standardwerten unerwartet auf ON festgelegt sein. Einzelheiten dazu finden Sie unter SET ANSI_DEFAULTS (Transact-SQL).

    IMPLICIT_TRANSACTIONS ON ist nicht beliebt. Wenn IMPLICIT_TRANSACTIONS auf ON gestellt ist, liegt dies in den meisten Fällen daran, dass SET ANSI_DEFAULTS ON gewählt wurde.

  • Der OLE DB-Anbieter für SQL Server Native Client und der ODBC-Treiber für SQL Server Native Client legen beim Herstellen einer Verbindung IMPLICIT_TRANSACTIONS automatisch auf OFF fest. SET IMPLICIT_TRANSACTIONS wird für Verbindungen mit dem SQLClient-verwalteten Anbieter und für SOAP-Anforderungen, die über HTTP-Endpunkte empfangen werden, standardmäßig auf OFF festgelegt.

Um die aktuelle Einstellung für IMPLICIT_TRANSACTIONS anzuzeigen, führen Sie die folgende Abfrage aus.

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

Beispiele

Das folgende Transact-SQL-Skript führt verschiedene Testfälle aus. Die Textausgabe, die das detaillierte Verhalten und die Ergebnisse von jedem Testfall anzeigt, wird ebenfalls bereitgestellt.

-- 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

Es folgt die Textausgabe des vorherigen Transact-SQL-Skripts.

-- Text output from 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  

Hier ist das Resultset.

Weitere Informationen

ALTER TABLE (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL)
CREATE TABLE (Transact-SQL)
DELETE (Transact-SQL)
DROP TABLE (Transact-SQL)
FETCH (Transact-SQL)
GRANT (Transact-SQL)
INSERT (Transact-SQL)
MERGE (Transact-SQL)OPEN (Transact-SQL)
REVOKE (Transact-SQL)
SELECT (Transact-SQL)
SET-Anweisungen (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
@@TRANCOUNT (Transact-SQL)
TRUNCATE TABLE (Transact-SQL)
UPDATE (Transact-SQL)