SET IMPLICIT_TRANSACTIONS (Transact-SQL)
Imposta la modalità di transazione implicita per la connessione.
Convenzioni della sintassi Transact-SQL
Sintassi
SET IMPLICIT_TRANSACTIONS { ON | OFF }
Osservazioni
Quando è impostata su ON, l'opzione SET IMPLICIT_TRANSACTIONS imposta per la connessione la modalità di transazione implicita. Quando è impostata su OFF, ripristina la modalità di transazione con autocommit. Le transazioni implicite potrebbero essere inaspettatamente ON a causa dei valori predefiniti ANSI. Quando IMPLICIT_TRANSACTIONS = ON, tramite un'istruzione BEGIN TRANSACTION esplicita verranno avviate due transazioni annidate.
Quando in una connessione è attivata la modalità di transazione implicita, ma la connessione non è inclusa in una transazione, l'esecuzione di una delle istruzioni seguenti comporta l'avvio di una transazione:
ALTER TABLE |
FETCH |
REVOKE |
BEGIN TRANSACTION |
GRANT |
SELECT (vedere l'eccezione riportata di seguito). |
CREATE |
INSERT |
TRUNCATE TABLE |
DELETE |
OPEN |
UPDATE |
DROP |
Se la connessione è già inclusa in una transazione aperta, le istruzioni non avviano una nuova transazione.
Per le transazioni che vengono aperte automaticamente in seguito all'impostazione dell'opzione su ON, è necessario che l'utente esegua il commit o il rollback in modo esplicito al termine della transazione. In caso contrario, quando l'utente si disconnette viene eseguito il rollback della transazione e di tutte le modifiche dei dati. Dopo il commit di una transazione, l'esecuzione di una delle istruzioni elencate in precedenza comporta l'avvio di una nuova transazione.
La modalità di transazione implicita rimane attiva fino a quando la connessione non esegue un'istruzione SET IMPLICIT_TRANSACTIONS OFF, con cui viene ripristinata per la connessione la modalità autocommit. In base a questa modalità viene eseguito il commit di tutte le singole istruzioni completate correttamente.
Il provider OLE DB Native Client SQL Server per SQL Server e il driver ODBC Native Client SQL Server impostano automaticamente l'opzione IMPLICIT_TRANSACTIONS su OFF al momento della connessione. L'impostazione predefinita di SET IMPLICIT_TRANSACTIONS è OFF per il provider gestito SQLClient e per le richieste SOAP ricevute tramite gli endpoint HTTP.
Quando l'opzione SET ANSI_DEFAULTS è impostata su ON, l'opzione SET IMPLICIT_TRANSACTIONS è ON.
L'esecuzione di un'istruzione BEGIN TRANSACTION quando SET IMPLICIT_TRANSACTIONS è ON comporta l'apertura di due transazioni nidificati. Tramite BEGIN_TRANSACTION viene incrementata la funzione @@trancount tutte le volte che una transazione è attiva.
L'opzione SET IMPLICIT_TRANSACTIONS viene impostata in fase di esecuzione, non in fase di analisi.
Tramite le istruzioni SELECT non selezionate da una tabella non vengono avviate transazioni implicite. Ad esempio SELECT GETDATE(); o SELECT 1, 'ABC'; non richiedono transazioni.
Per visualizzare l'impostazione corrente per IMPLICIT_TRANSACTIONS, eseguire la query riportata di seguito.
DECLARE @IMPLICIT_TRANSACTIONS VARCHAR(3) = 'OFF';
IF ( (2 & @@OPTIONS) = 2 ) SET @IMPLICIT_TRANSACTIONS = 'ON';
SELECT @IMPLICIT_TRANSACTIONS AS IMPLICIT_TRANSACTIONS;
Esempi
Nell'esempio seguente vengono illustrati l'avvio implicito ed esplicito di transazioni tramite l'opzione IMPLICIT_TRANSACTIONS impostata su ON. Viene utilizzata la funzione @@TRANCOUNT per illustrare transazioni aperte e chiuse.
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
Set di risultati:
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
Vedere anche
Riferimento
BEGIN TRANSACTION (Transact-SQL)