SET IMPLICIT_TRANSACTIONS (Transact-SQL)
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Analytics Platform System (PDW) Warehouse in Microsoft Fabric
Imposta la modalità BEGIN TRANSACTION su implicita per la connessione.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
SET IMPLICIT_TRANSACTIONS { ON | OFF }
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:
ALTER TABLE
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();
oSELECT 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
Il set di risultati è il seguente.
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)
INSERT (Transact-SQL)
MERGE (Transact-SQL)OPEN (Transact-SQL)
REVOKE (Transact-SQL)
SELECT (Transact-SQL)
Istruzioni SET (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
@@TRANCOUNT (Transact-SQL)
TRUNCATE TABLE (Transact-SQL)
UPDATE (Transact-SQL)