SET IMPLICIT_TRANSACTIONS (Transact-SQL)

 

DIESES THEMA GILT FÜR:jaSQL Server (ab 2008)jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data Warehouse

Wird der BEGIN TRANSACTION-Modus auf implizite, für die Verbindung.

Topic link icon Transact-SQL-Syntaxkonventionen

-- Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse  
  
SET IMPLICIT_TRANSACTIONS { ON | OFF }  

Wenn AUF das System ist im implizite Transaktionsmodus. Dies bedeutet, dass bei @@TRANCOUNT = 0, eine der folgenden Transact-SQL-Anweisungen beginnt eine neue Transaktion. Dies entspricht einer unsichtbaren BEGIN TRANSACTION zuerst ausgeführt wird:

ALTER TABLEFETCHREVOKE
BEGIN TRANSACTIONGRANTSELECT (siehe die Ausnahme unten).
CREATEINSERTTRUNCATE TABLE
DELETEOPENUPDATE
DROP..

Wenn wird OFF aller vorhergehenden T-SQL-Anweisungen durch eine unsichtbaren BEGIN TRANSACTION und einem unsichtbaren COMMIT TRANSACTION-Anweisung festgelegt. Bei OFF wir sprechen wird von der Transaktionsmodus Autocommit. Wenn Ihr T-SQL-Code sichtbar eine BEGIN TRANSACTION ausgegeben wird, sagen wir der Transaktionsmodus wird explizite.

Es gibt mehrere clarifying Punkt zu verstehen:

  • Wenn Sie der Transaktionsmodus implizit ist, keine sichtbar BEGIN TRANSACTION wird ausgegeben, wenn @@trancount > 0 bereits. Allerdings weiterhin alle expliziten BEGIN TRANSACTION-Anweisungen Inkrement @@TRANCOUNT.

  • Wenn INSERT-Anweisungen und nichts in die Arbeitseinheit abgeschlossen ist, müssen Sie bis zum COMMIT TRANSACTION-Anweisungen ausgeben @@TRANCOUNT wieder auf 0 verringert wird. Oder Sie können eine ROLLBACK TRANSACTION 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 möglicherweise unerwartet ON aufgrund von ANSI-Standards. Weitere Informationen finden Sie SET ANSI_DEFAULTS ( Transact-SQL ).

    IMPLICIT_TRANSACTIONS ON ist nicht beliebt. In den meisten Fällen, in denen IMPLICIT_TRANSACTIONS auf ON festgelegt ist, ist es, weil die Auswahl der SET ANSI_DEFAULTS ON vorgenommen wurde.

  • Die SQL Server Native Client OLE DB-Anbieter für SQL Server, und die SQL Server Native Client ODBC-Treiber automatisch IMPLICIT_TRANSACTIONS auf OFF festgelegt, wenn eine Verbindung herstellen. Für Verbindungen mit dem verwalteten SQLClient-Anbieter und für SOAP-Anforderungen, die über HTTP-Endpunkte empfangen, standardmäßig SET IMPLICIT_TRANSACTIONS auf OFF.

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;  

Die folgende Transact-SQL-Skript wird ein paar unterschiedliche Testfälle ausgeführt. Die Ausgabe von Text wird ebenfalls bereitgestellt, die zeigt, des detaillierten Verhaltens und von jedem Testfall muss führt.

-- Transact-SQL.  
go  
-- 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 INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
COMMIT TRANSACTION;  
PRINT N'[D.05] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
go  
  
-- Clean up.  
SET IMPLICIT_TRANSACTIONS OFF;  
go  
WHILE (@@TranCount > 0) COMMIT TRANSACTION;  
go  
DROP TABLE dbo.t1;  
go  

Als Nächstes wird die Ausgabe von Text aus dem vorherigen Transact-SQL-Skript aus.

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

Im Folgenden finden Sie das Resultset.

ALTER TABLE ( Transact-SQL )
BEGIN TRANSACTION ( Transact-SQL )
ERSTELLEN von TABELLEN ( Transact-SQL )
DELETE ( Transact-SQL )
DROP TABLE ( Transact-SQL )
Abrufen von DATEN ( Transact-SQL )
GRANT ( Transact-SQL )
INSERT ( 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 )

Community-Beiträge

HINZUFÜGEN
Anzeigen: