Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Azure SQL-Instanz
Azure Synapse Analytics
Analytics Platform System (PDW)
Lagerhaus in Microsoft Fabric
SQL-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 TABLEBEGIN TRANSACTIONCREATEDELETEDROPFETCHGRANTINSERTMERGEOPENREVOKE-
SELECT(Siehe klärende Bemerkung) TRUNCATE TABLEUPDATE
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 TRANSACTIONausgegeben, falls@@TRANCOUNT > 0bereits vorhanden. Allerdings erhöhen expliziteBEGIN TRANSACTIONAnweisungen weiterhin@@TRANCOUNT.Wenn Ihre
INSERTAuszüge und alles andere in Ihrer Arbeitseinheit erledigt sind, müssen Sie Auszüge ausstellenCOMMIT TRANSACTION, bis@@TRANCOUNTsie wieder auf 0 reduziert sind. Oder Sie können eineROLLBACK TRANSACTIONherausgeben.
SELECTAussagen, die nicht aus einer Tabelle auswählen, starten keine impliziten Transaktionen. Zum Beispiel,SELECT GETDATE();oderSELECT 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_TRANSACTIONSistONnicht beliebt. In den meisten Fällen, in denenIMPLICIT_TRANSACTIONSgiltON, liegt es daran, dassSET ANSI_DEFAULTS ONgesetzt wurde.Der SQL Server Native Client OLE DB Provider für SQL Server und der SQL Server Native Client ODBC-Treiber sind automatisch auf
OFFbeim Verbinden eingestelltIMPLICIT_TRANSACTIONS. SetzenIMPLICIT_TRANSACTIONSSie die Standardwerte aufOFFfü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
Verwandte Inhalte
- ALTER TABLE (Transact-SQL)
- TRANSAKTION BEGINNEN (Transact-SQL)
- Tabelle erstellen (Transact-SQL)
- LÖSCHEN (Transact-SQL)
- DROP TABLE (Transact-SQL)
- APPORTIEREN (Transact-SQL)
- ZUSCHUSS (Transact-SQL)
- EINFÜGEN (Transact-SQL)
- MERGE (Transact-SQL)
- OFFEN (Transact-SQL)
- WIDERRUFEN (Transact-SQL)
- SELECT (Transact-SQL)
- SET-Anweisungen (Transact-SQL)
- SET ANSI_DEFAULTS (Transact-SQL)
- @@TRANCOUNT (Transact-SQL)
- ABSCHNEIDE TABELLE (Transact-SQL)
- AKTUALISIERUNG (Transact-SQL)