SET IMPLICIT_TRANSACTIONS (Transact-SQL)SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database JaVerwaltete Azure SQL-InstanzAzure SQL Managed InstanceYesVerwaltete Azure SQL-InstanzAzure SQL Managed Instance JaAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics JaParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data WarehouseAnwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database JaVerwaltete Azure SQL-InstanzAzure SQL Managed InstanceYesVerwaltete Azure SQL-InstanzAzure SQL Managed Instance JaAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics JaParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse

Legt den BEGIN TRANSACTION-Modus für die Verbindung auf implicit.Sets the BEGIN TRANSACTION mode to implicit, for the connection.

Symbol für Themenlink Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

SET IMPLICIT_TRANSACTIONS { ON | OFF }  

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 oder früher finden Sie unter Dokumentation zu früheren Versionen.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

BemerkungenRemarks

Bei ON ist das System im implicit-Transaktionsmodus.When ON, the system is in implicit transaction mode. Dies bedeutet, dass wenn @@TRANCOUNT = 0 ist, jede der folgenden Transact-SQL-Anweisungen eine neue Transaktion beginnt.This means that if @@TRANCOUNT = 0, any of the following Transact-SQL statements begins a new transaction. Sie entspricht einer unsichtbaren BEGIN TRANSACTION-Anweisung, die zuerst ausgeführt wird:It is equivalent to an unseen BEGIN TRANSACTION being executed first:

ALTER TABLEALTER TABLE

FETCHFETCH

REVOKEREVOKE

BEGIN TRANSACTIONBEGIN TRANSACTION

GRANTGRANT

SELECT (siehe die Ausnahme unten).SELECT (See exception below.)

CREATECREATE

INSERTINSERT

TRUNCATE TABLETRUNCATE TABLE

DeleteDELETE

OPENOPEN

UPDATEUPDATE

DROPDROP

 

Bei OFF werden alle vorherigen T-SQL-Anweisungen von einer unsichtbaren BEGIN TRANSACTION- und einer unsichtbaren COMMIT TRANSACTION-Anweisung begrenzt.When OFF, each of the preceding T-SQL statements is bounded by an unseen BEGIN TRANSACTION and an unseen COMMIT TRANSACTION statement. Bei OFF spricht man vom Transaktionsmodus autocommit.When OFF, we say the transaction mode is autocommit. Wenn von Ihrem T-SQL-Code BEGIN TRANSACTION ausgegeben wird, spricht man vom Transaktionsmodus explicit.If your T-SQL code visibly issues a BEGIN TRANSACTION, we say the transaction mode is explicit.

Es gibt mehrere Punkte, die für das Verständnis geklärt werden müssen:There are several clarifying points to understand:

  • Bei einem impliziten Transaktionsmodus wird keine unsichtbare BEGIN TRANSACTION ausgegeben, wenn @@trancount > 0 .When the transaction mode is implicit, no unseen BEGIN TRANSACTION is issued if @@trancount > 0 already. Allerdings erhöhen alle expliziten BEGIN TRANSACTION-Anweisungen auch weiterhin @@TRANCOUNT.However, any explicit BEGIN TRANSACTION statements still increment @@TRANCOUNT.

  • Wenn Ihre INSERT-Anweisungen und noch etwas anderes in Ihrer Arbeitseinheit abgeschlossen ist, müssen Sie COMMIT TRANSACTION-Anweisungen ausgeben, bis @@TRANCOUNT zurück auf 0 gestellt ist.When your INSERT statements and anything else in your unit of work is finished, you must issue COMMIT TRANSACTION statements until @@TRANCOUNT is decremented back down to 0. Allerdings können Sie eine ROLLBACK TRANSACTION-Anweisung ausgeben.Or you can issue one ROLLBACK TRANSACTION.

  • Von SELECT-Anweisungen, die keine Daten aus einer Tabelle auswählen, werden keine impliziten Transaktionen gestartet.SELECT statements that do not select from a table do not start implicit transactions. SELECT GETDATE(); oder SELECT 1, 'ABC'; erfordern beispielsweise keine Transaktionen.For example SELECT GETDATE(); or SELECT 1, 'ABC'; do not require transactions.

  • Implizite Transaktionen können aufgrund von ANSI-Standardwerten unerwartet auf ON festgelegt sein.Implicit transactions may unexpectedly be ON due to ANSI defaults. Einzelheiten dazu finden Sie unter SET ANSI_DEFAULTS (Transact-SQL).For details see SET ANSI_DEFAULTS (Transact-SQL).

    IMPLICIT_TRANSACTIONS ON ist nicht beliebt.IMPLICIT_TRANSACTIONS ON is not popular. Wenn IMPLICIT_TRANSACTIONS auf ON gestellt ist, liegt dies in den meisten Fällen daran, dass SET ANSI_DEFAULTS ON gewählt wurde.In most cases where IMPLICIT_TRANSACTIONS is ON, it is because the choice of SET ANSI_DEFAULTS ON has been made.

  • Der SQL ServerSQL Server Native Client-OLE DB-Anbieter für SQL ServerSQL Server und der SQL ServerSQL Server Native Client-ODBC-Treiber legen beim Herstellen einer Verbindung IMPLICIT_TRANSACTIONS automatisch auf OFF fest.The SQL ServerSQL Server Native Client OLE DB Provider for SQL ServerSQL Server, and the SQL ServerSQL Server Native Client ODBC driver, automatically set IMPLICIT_TRANSACTIONS to OFF when connecting. 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.SET IMPLICIT_TRANSACTIONS defaults to OFF for connections with the SQLClient managed provider, and for SOAP requests received through HTTP endpoints.

Um die aktuelle Einstellung für IMPLICIT_TRANSACTIONS anzuzeigen, führen Sie die folgende Abfrage aus.To view the current setting for IMPLICIT_TRANSACTIONS, run the following query.

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

BeispieleExamples

Das folgende Transact-SQL-Skript führt verschiedene Testfälle aus.The following Transact-SQL script runs a few different test cases. Die Textausgabe, die das detaillierte Verhalten und die Ergebnisse von jedem Testfall anzeigt, wird ebenfalls bereitgestellt.The text output is also provided, which shows the detailed behavior and results from each test case.

-- 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.Next is the text output from the preceding Transact-SQL script.

-- 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 INSERTs, == 1  
[D.05] @@TranCount, after INSERTs, == 0  

Hier ist das Resultset.Here is the result set.

Weitere InformationenSee Also

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