Freigeben über


SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzAzure Synapse AnalyticsAnalytics Platform System (PDW)Lagerhaus in Microsoft FabricSQL-Datenbank in Microsoft Fabric

Setzt den BEGIN TRANSACTION Modus auf implizit für die Verbindung.

Transact-SQL-Syntaxkonventionen

Syntax

SET IMPLICIT_TRANSACTIONS { ON | OFF }

Hinweise

Wenn ON, befindet sich das System im impliziten Transaktionsmodus. Das bedeutet, dass, wenn @@TRANCOUNT = 0, eine der folgenden Transact-SQL Aussagen eine neue Transaktion startet. Es entspricht einer unsichtbaren BEGIN TRANSACTION Hinrichtung, die zuerst hingerichtet wird:

  • ALTER TABLE
  • BEGIN TRANSACTION
  • CREATE
  • DELETE
  • DROP
  • FETCH
  • GRANT
  • INSERT
  • MERGE
  • OPEN
  • REVOKE
  • SELECT (Siehe klärende Bemerkung)
  • TRUNCATE TABLE
  • UPDATE

Wenn OFF, ist jede der vorangegangenen T-SQL-Anweisungen durch eine unsichtbare BEGIN TRANSACTION und eine unsichtbare COMMIT TRANSACTION Anweisung begrenzt. Wenn OFF, sagen wir, der Transaktionsmodus ist automatisch committiert. Wenn Ihr T-SQL-Code sichtbar ein BEGIN TRANSACTIONausgibt, sagen wir, dass der Transaktionsmodus explizit ist.

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

  • Wenn der Transaktionsmodus implizit ist, wird kein Unsichtbares BEGIN TRANSACTION ausgegeben, falls @@TRANCOUNT > 0 bereits vorhanden. Allerdings erhöhen explizite BEGIN TRANSACTION Anweisungen weiterhin @@TRANCOUNT.

  • Wenn Ihre INSERT Auszüge und alles andere in Ihrer Arbeitseinheit erledigt sind, müssen Sie Auszüge ausstellen COMMIT TRANSACTION , bis @@TRANCOUNT sie wieder auf 0 reduziert sind. Oder Sie können eine ROLLBACK TRANSACTIONherausgeben.

  • SELECT Aussagen, die nicht aus einer Tabelle auswählen, starten keine impliziten Transaktionen. Zum Beispiel, SELECT GETDATE(); oder SELECT 1, 'ABC'; keine Transaktionen erfordern.

  • Implizite Transaktionen könnten unerwartet auf ANSI-Zahlungsausfälle zurückzuführen sein ON . Details finden Sie unter SET ANSI_DEFAULTS.

    Einstellung IMPLICIT_TRANSACTIONS ist ON nicht beliebt. In den meisten Fällen, in denen IMPLICIT_TRANSACTIONS gilt ON, liegt es daran, dass SET ANSI_DEFAULTS ON gesetzt wurde.

  • Der SQL Server Native Client OLE DB Provider für SQL Server und der SQL Server Native Client ODBC-Treiber sind automatisch auf OFF beim Verbinden eingestelltIMPLICIT_TRANSACTIONS. Setzen IMPLICIT_TRANSACTIONS Sie die Standardwerte auf OFF für Verbindungen mit dem verwalteten SQLClient-Anbieter und für SOAP-Anfragen, die über HTTP-Endpunkte empfangen werden.

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

DECLARE @IMPLICIT_TRANSACTIONS AS 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.

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

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