Condividi tramite


SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di analisi (PDW)Warehouse in Microsoft FabricDatabase SQL in Microsoft Fabric

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

Convenzioni relative alla sintassi Transact-SQL

Sintassi

SET IMPLICIT_TRANSACTIONS { ON | OFF }

Osservazioni:

Quando ON, il sistema è in modalità transazione implicita . Ciò significa che se @@TRANCOUNT = 0, una qualsiasi delle seguenti Transact-SQL istruzioni inizia una nuova transazione. È equivalente a un invisibile BEGIN TRANSACTION che viene eseguito per primo:

  • ALTER TABLE
  • BEGIN TRANSACTION
  • CREATE
  • DELETE
  • DROP
  • FETCH
  • GRANT
  • INSERT
  • MERGE
  • OPEN
  • REVOKE
  • SELECT (Vedi osservazione chiarificativa)
  • TRUNCATE TABLE
  • UPDATE

Quando OFF, ciascuna delle istruzioni T-SQL precedenti è limitata da unvisible BEGIN TRANSACTION e COMMIT TRANSACTION una unvista. Quando OFF, diciamo che la modalità transazione è autocommit. Se il tuo codice T-SQL emette visibilmente un BEGIN TRANSACTION, diciamo che la modalità transazione è esplicita.

È necessario comprendere e chiarire alcuni punti:

  • Quando la modalità transazione è implicita, non viene emesso nulla di invisibile BEGIN TRANSACTION , se @@TRANCOUNT > 0 già presente. Tuttavia, qualsiasi affermazione esplicita BEGIN TRANSACTION incrementa comunque @@TRANCOUNT.

  • Quando le tue INSERT dichiarazioni e qualsiasi altra cosa nella tua unità di lavoro sono terminate, devi emettere COMMIT TRANSACTION estratti conto finché non @@TRANCOUNT venga decrementata a zero. Oppure puoi emetterne uno ROLLBACK TRANSACTION.

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

  • Le transazioni implicite potrebbero essere ON inaspettatamente dovute a default ANSI. Per i dettagli vedi SET ANSI_DEFAULTS.

    Impostare IMPLICIT_TRANSACTIONS su ON non è popolare. Nella maggior parte dei casi dove IMPLICIT_TRANSACTIONS è ON, è perché SET ANSI_DEFAULTS ON era impostato.

  • Il provider SQL Server Native Client OLE DB per SQL Server e il driver SQL Server Native Client ODBC vengono impostati IMPLICIT_TRANSACTIONS automaticamente su OFF al momento della connessione. Imposta IMPLICIT_TRANSACTIONS i valori predefiniti per OFF le connessioni con il provider gestito SQLClient e per le richieste SOAP ricevute tramite endpoint HTTP.

Per visualizzare l'impostazione attuale di IMPLICIT_TRANSACTIONS, esegui la seguente interrogazione.

DECLARE @IMPLICIT_TRANSACTIONS AS 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.

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

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