SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Si applica a:SQL Server database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)Warehouse in Microsoft Fabric

Imposta la modalità BEGIN TRANSACTION su implicita per la connessione.

Convenzioni di sintassi Transact-SQL

Sintassi

SET IMPLICIT_TRANSACTIONS { ON | OFF }  

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Osservazioni:

Quando è impostata su ON, il sistema è in modalità di transazione implicita. Ciò significa che se @@TRANCOUNT = 0, una qualsiasi delle istruzioni Transact-SQL seguenti avvia una nuova transazione. Equivale a un'istruzione BEGIN TRANSACTION non visibile eseguita per prima:

MODIFICA TABELLA

FETCH

REVOKE

BEGIN TRANSACTION

GRANT

SELECT (vedere l'eccezione riportata di seguito)

CREATE

INSERT

TRUNCATE TABLE

DELETE

MERGE

UPDATE

DROP

OPEN

 

Quando è impostata su OFF, ognuna delle istruzioni T-SQL precedenti è vincolata da un'istruzione BEGIN TRANSACTION e COMMIT TRANSACTION non visibile. Quando è impostata su OFF, la modalità di transazione è nota come autocommit. Se il codice T-SQL esegue un'istruzione BEGIN TRANSACTION in modo visibile, la modalità di transazione è esplicita.

È necessario comprendere e chiarire alcuni punti:

  • Quando la modalità transazione è implicita, non viene eseguita alcuna istruzione BEGIN TRANSACTION non visibile se @@trancount > 0. Le istruzioni BEGIN TRANSACTION esplicite continuano tuttavia a incrementare @@TRANCOUNT.

  • Quando le istruzioni INSERT e le altre attività nell'unità di lavoro sono state completate, è necessario eseguire le istruzioni COMMIT TRANSACTION fino a quando @@TRANCOUNT non viene di nuovo ridotto a 0. Oppure è possibile eseguire un'istruzione ROLLBACK TRANSACTION.

  • Le istruzioni SELECT che non effettuano la selezione da una tabella non avviano transazioni implicite. Ad esempio SELECT GETDATE(); o SELECT 1, 'ABC'; non richiedono transazioni.

  • Le transazioni implicite potrebbero essere inaspettatamente impostate su ON a causa dei valori ANSI predefiniti. Per informazioni dettagliate, vedere SET ANSI_DEFAULTS (Transact-SQL).

    IMPLICIT_TRANSACTIONS ON non è un'impostazione molto diffusa. Nella maggior parte dei casi, l'impostazione di IMPLICIT_TRANSACTIONS su ON dipende dal fatto che si è scelto di impostare SET ANSI_DEFAULTS su ON.

  • Il provider OLE DB di SQL Server Native Client per SQL Server e il driver ODBC di SQL Server Native Client impostano automaticamente l'opzione IMPLICIT_TRANSACTIONS su OFF al momento della connessione. Per le connessioni con il provider gestito SQLClient e le richieste SOAP ricevute tramite gli endpoint HTTP, l'impostazione predefinita di SET IMPLICIT_TRANSACTIONS è OFF.

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

Lo script Transact-SQL seguente esegue alcuni test case diversi. Viene anche fornito l'output di testo che illustra il comportamento e i risultati dettagliati di ogni test case.

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

Di seguito è riportato l'output di testo dello script Transact-SQL precedente.

-- 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 a COMMIT, == 1  
[D.05] @@TranCount, after another COMMIT, == 0  

Questo è il set di risultati.

Vedi anche

ALTER TABLE (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL)
CREATE TABLE (Transact-SQL)
DELETE (Transact-SQL)
DROP TABLE (Transact-SQL)
FETCH (Transact-SQL)
GRANT (Transact-SQL)
IN edizione Standard RT (Transact-SQL)
MERGE (Transact-SQL)OPEN (Transact-SQL)
REVOKE (Transact-SQL)
SELECT (Transact-SQL)
Istruzioni edizione Standard T (Transact-SQL)
edizione Standard T ANSI_DEFAULTS (Transact-SQL)
@@TRANCOUNT (Transact-SQL)
TRUNCATE TABLE (Transact-SQL)
UPDATE (Transact-SQL)