SET IMPLICIT_TRANSACTIONS (Transact-SQL)
Legt den impliziten Transaktionsmodus für die Verbindung fest.
Gilt für: SQL Server (SQL Server 2008 bis aktuelle Version), Windows Azure SQL-Datenbank (ursprüngliche Version bis aktuelle Version). |
Transact-SQL-Syntaxkonventionen
Syntax
SET IMPLICIT_TRANSACTIONS { ON | OFF }
Hinweise
Ist SET IMPLICIT_TRANSACTIONS auf ON festgelegt, so wird für die Verbindung der implizite Transaktionsmodus festgelegt. Bei OFF wechselt die Verbindung wieder in den Autocommit-Transaktionsmodus zurück. Implizite Transaktionen können aufgrund von ANSI-Standardwerten unerwartet auf ON festgelegt sein. Wenn IMPLICIT_TRANSACTIONS auf ON festgelegt ist, werden durch eine explizite BEGIN TRANSACTION-Anweisung zwei geschachtelte Transaktionen gestartet.
Wenn sich eine Verbindung im impliziten Transaktionsmodus befindet und zurzeit an keiner Transaktion beteiligt ist, wird durch die Ausführung der folgenden Anweisungen eine Transaktion gestartet:
ALTER TABLE |
FETCH |
REVOKE |
BEGIN TRANSACTION |
GRANT |
SELECT (siehe die Ausnahme unten). |
CREATE |
INSERT |
TRUNCATE TABLE |
DELETE |
OPEN |
UPDATE |
DROP |
Befindet sich die Verbindung bereits in einer geöffneten Transaktion, so starten diese Anweisungen keine neue Transaktion.
Für Transaktionen, die automatisch geöffnet werden, weil diese Einstellung auf ON festgelegt ist, muss am Ende der Transaktion vom Benutzer explizit ein Commit oder Rollback ausgeführt werden. Andernfalls wird für die Transaktion und alle darin enthaltenen Datenänderungen ein Rollback ausgeführt, wenn der Benutzer die Verbindung trennt. Wird für eine Transaktion ein Commit durchgeführt und dann eine der oben aufgeführten Anweisungen ausgeführt, so wird dadurch eine neue Transaktion gestartet.
Der implizite Transaktionsmodus bleibt wirksam, bis die Verbindung eine SET IMPLICIT_TRANSACTIONS OFF-Anweisung ausführt, wodurch die Verbindung in den Autocommitmodus zurückkehrt. Im Autocommitmodus wird für jede erfolgreich ausgeführte Anweisung ein Commit durchgeführt.
Der SQL Server Native Client-OLE DB-Anbieter für SQL Server und der SQL Server Native Client-ODBC-Treiber 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.
Ist SET ANSI_DEFAULTS auf ON festgelegt, so ist SET IMPLICIT_TRANSACTIONS auf ON festgelegt.
Wenn eine BEGIN TRANSACTION-Anweisung ausgeführt wird, während SET IMPLICIT_TRANSACTIONS auf ON festgelegt ist, werden zwei geschachtelte Transaktionen geöffnet. Sobald eine Transaktion aktiv ist, wird @@trancount von BEGIN_TRANSACTION erhöht.
Die Einstellung von SET IMPLICIT_TRANSACTIONS wird zur Ausführungszeit und nicht zur Analysezeit festgelegt.
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.
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
Im folgenden Beispiel werden Transaktionen gezeigt, die explizit und implizit gestartet werden, wobei IMPLICIT_TRANSACTIONS auf ON festgelegt ist. Die @@TRANCOUNT-Funktion wird verwendet, um geöffnete bzw. geschlossene Transaktionen zu zeigen.
SET NOCOUNT ON;
GO
SET IMPLICIT_TRANSACTIONS OFF;
GO
PRINT N'Tran count at start = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
IF OBJECT_ID(N'dbo.t1',N'U') IS NOT NULL
DROP TABLE dbo.t1;
GO
CREATE table dbo.t1 (a int);
GO
INSERT INTO dbo.t1 VALUES (1);
GO
PRINT N'Use explicit transaction.';
BEGIN TRANSACTION;
GO
INSERT INTO dbo.t1 VALUES (2);
GO
PRINT N'Tran count in explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
GO
PRINT N'Tran count after explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
PRINT N'Setting IMPLICIT_TRANSACTIONS ON.';
GO
SET IMPLICIT_TRANSACTIONS ON;
GO
PRINT N'Use implicit transactions.';
GO
-- No BEGIN TRAN needed here.
INSERT INTO dbo.t1 VALUES (4);
GO
PRINT N'Tran count in implicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
PRINT N'Tran count after implicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
PRINT N'Nest an explicit transaction with IMPLICIT_TRANSACTIONS ON.';
GO
PRINT N'Tran count before nested explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
BEGIN TRANSACTION;
PRINT N'Tran count after nested BEGIN TRAN in implicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO dbo.t1 VALUES (5);
COMMIT TRANSACTION;
PRINT N'Tran count after nested explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
-- Commit outstanding transaction.
COMMIT TRANSACTION;
GO
Dies ist das Resultset.
Tran count at start = 2
Use explicit transaction.
Tran count in explicit transaction = 3
Tran count after explicit transaction = 2
Setting IMPLICIT_TRANSACTIONS ON.
Use implicit transactions.
Tran count in implicit transaction = 2
Tran count after implicit transaction = 1
Nest an explicit transaction with IMPLICIT_TRANSACTIONS ON.
Tran count before nested explicit transaction = 1
Tran count after nested BEGIN TRAN in implicit transaction = 2
Tran count after nested explicit transaction = 1
Siehe auch
Verweis
BEGIN TRANSACTION (Transact-SQL)
SET-Anweisungen (Transact-SQL)