SET IMPLICIT_TRANSACTIONS (Transact-SQL)SET IMPLICIT_TRANSACTIONS (Transact-SQL)

SI APPLICA A: sìSQL Server sìDatabase SQL di Azure sìAzure SQL Data Warehouse sìParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Imposta la modalità BEGIN TRANSACTION su implicita per la connessione.Sets the BEGIN TRANSACTION mode to implicit, for the connection.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

SET IMPLICIT_TRANSACTIONS { ON | OFF }  

RemarksRemarks

Quando è impostata su ON, il sistema è in modalità di transazione implicita.When ON, the system is in implicit transaction mode. Ciò significa che se @@TRANCOUNT = 0, una qualsiasi delle istruzioni Transact-SQL seguenti avvia una nuova transazione.This means that if @@TRANCOUNT = 0, any of the following Transact-SQL statements begins a new transaction. Equivale a un'istruzione BEGIN TRANSACTION non visibile eseguita per prima:It is equivalent to an unseen BEGIN TRANSACTION being executed first:

ALTER TABLEALTER TABLE FETCHFETCH REVOKEREVOKE
BEGIN TRANSACTIONBEGIN TRANSACTION GRANTGRANT SELECT (vedere l'eccezione riportata di seguito)SELECT (See exception below.)
CREATECREATE INSERTINSERT TRUNCATE TABLETRUNCATE TABLE
EliminaDELETE OPENOPEN UPDATEUPDATE
DROPDROP .. ..

Quando è impostata su OFF, ognuna delle istruzioni T-SQL precedenti è vincolata da un'istruzione BEGIN TRANSACTION e COMMIT TRANSACTION non visibile.When OFF, each of the preceding T-SQL statements is bounded by an unseen BEGIN TRANSACTION and an unseen COMMIT TRANSACTION statement. Quando è impostata su OFF, la modalità di transazione è nota come autocommit.When OFF, we say the transaction mode is autocommit. Se il codice T-SQL esegue un'istruzione BEGIN TRANSACTION in modo visibile, la modalità di transazione è esplicita.If your T-SQL code visibly issues a BEGIN TRANSACTION, we say the transaction mode is explicit.

È necessario comprendere e chiarire alcuni punti:There are several clarifying points to understand:

  • Quando la modalità transazione è implicita, non viene eseguita alcuna istruzione BEGIN TRANSACTION non visibile se @@trancount > 0.When the transaction mode is implicit, no unseen BEGIN TRANSACTION is issued if @@trancount > 0 already. Le istruzioni BEGIN TRANSACTION esplicite continuano tuttavia a incrementare @@TRANCOUNT.However, any explicit BEGIN TRANSACTION statements still increment @@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.When your INSERT statements and anything else in your unit of work is finished, you must issue COMMIT TRANSACTION statements until @@TRANCOUNT is decremented back down to 0. Oppure è possibile eseguire un'istruzione ROLLBACK TRANSACTION.Or you can issue one ROLLBACK TRANSACTION.

  • Le istruzioni SELECT che non effettuano la selezione da una tabella non avviano transazioni implicite.SELECT statements that do not select from a table do not start implicit transactions. Ad esempio SELECT GETDATE(); o SELECT 1, 'ABC'; non richiedono transazioni.For example SELECT GETDATE(); or SELECT 1, 'ABC'; do not require transactions.

  • Le transazioni implicite potrebbero essere inaspettatamente impostate su ON a causa dei valori ANSI predefiniti.Implicit transactions may unexpectedly be ON due to ANSI defaults. Per informazioni dettagliate, vedere SET ANSI_DEFAULTS (Transact-SQL).For details see SET ANSI_DEFAULTS (Transact-SQL).

    IMPLICIT_TRANSACTIONS ON non è un'impostazione molto diffusa.IMPLICIT_TRANSACTIONS ON is not popular. 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.In most cases where IMPLICIT_TRANSACTIONS is ON, it is because the choice of SET ANSI_DEFAULTS ON has been made.

  • Il provider OLE DB per SQL ServerSQL Server Native Client per SQL ServerSQL Server e il driver ODBC per SQL ServerSQL Server Native Client impostano automaticamente l'opzione IMPLICIT_TRANSACTIONS su OFF al momento della connessione.The SQL ServerSQL Server Native Client OLE DB Provider for SQL ServerSQL Server, and the SQL ServerSQL Server Native Client ODBC driver, automatically set IMPLICIT_TRANSACTIONS to OFF when connecting. 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.SET IMPLICIT_TRANSACTIONS defaults to OFF for connections with the SQLClient managed provider, and for SOAP requests received through HTTP endpoints.

Per visualizzare l'impostazione corrente per IMPLICIT_TRANSACTIONS, eseguire la query riportata di seguito.To view the current setting for IMPLICIT_TRANSACTIONS, run the following query.

DECLARE @IMPLICIT_TRANSACTIONS VARCHAR(3) = 'OFF';  
IF ( (2 & @@OPTIONS) = 2 ) SET @IMPLICIT_TRANSACTIONS = 'ON';  
SELECT @IMPLICIT_TRANSACTIONS AS IMPLICIT_TRANSACTIONS;  

EsempiExamples

Lo script Transact-SQL seguente esegue alcuni test case diversi.The following Transact-SQL script runs a few different test cases. Viene anche fornito l'output di testo che illustra il comportamento e i risultati dettagliati di ogni test case.The text output is also provided, which shows the detailed behavior and results from each test case.

-- Transact-SQL.  
go  
-- 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 INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
COMMIT TRANSACTION;  
PRINT N'[D.05] @@TranCount, after INSERTs, == ' + 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.Next is the text output from the preceding Transact-SQL script.

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

Set di risultati:Here is the result set.

Vedere ancheSee Also

ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL) BEGIN TRANSACTION (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
DELETE (Transact-SQL) DELETE (Transact-SQL)
DROP TABLE (Transact-SQL) DROP TABLE (Transact-SQL)
FETCH (Transact-SQL) FETCH (Transact-SQL)
GRANT (Transact-SQL) GRANT (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
OPEN (Transact-SQL) OPEN (Transact-SQL)
REVOKE (Transact-SQL) REVOKE (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
Istruzioni SET (Transact-SQL) SET Statements (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL) SET ANSI_DEFAULTS (Transact-SQL)
@@TRANCOUNT (Transact-SQL) @@TRANCOUNT (Transact-SQL)
TRUNCATE TABLE (Transact-SQL) TRUNCATE TABLE (Transact-SQL)
UPDATE (Transact-SQL)UPDATE (Transact-SQL)