Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Database SQL di
AzureIstanza gestita di SQL di
AzureAzure Synapse Analytics
Piattaforma di analisi (PDW)
Warehouse in Microsoft Fabric
Database 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 TABLEBEGIN TRANSACTIONCREATEDELETEDROPFETCHGRANTINSERTMERGEOPENREVOKE-
SELECT(Vedi osservazione chiarificativa) TRUNCATE TABLEUPDATE
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 > 0già presente. Tuttavia, qualsiasi affermazione esplicitaBEGIN TRANSACTIONincrementa comunque@@TRANCOUNT.Quando le tue
INSERTdichiarazioni e qualsiasi altra cosa nella tua unità di lavoro sono terminate, devi emettereCOMMIT TRANSACTIONestratti conto finché non@@TRANCOUNTvenga decrementata a zero. Oppure puoi emetterne unoROLLBACK TRANSACTION.
SELECTLe istruzioni che non selezionano da una tabella non avviano transazioni implicite. Per esempio,SELECT GETDATE();oSELECT 1, 'ABC';non richiedono transazioni.Le transazioni implicite potrebbero essere
ONinaspettatamente dovute a default ANSI. Per i dettagli vedi SET ANSI_DEFAULTS.Impostare
IMPLICIT_TRANSACTIONSsuONnon è popolare. Nella maggior parte dei casi doveIMPLICIT_TRANSACTIONSèON, è perchéSET ANSI_DEFAULTS ONera impostato.Il provider SQL Server Native Client OLE DB per SQL Server e il driver SQL Server Native Client ODBC vengono impostati
IMPLICIT_TRANSACTIONSautomaticamente suOFFal momento della connessione. ImpostaIMPLICIT_TRANSACTIONSi valori predefiniti perOFFle 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
Contenuti correlati
- ALTER TABLE (Transact-SQL)
- INIZIO TRANSAZIONE (Transact-SQL)
- CREA TABELLA (Transact-SQL)
- CANCELLA (Transact-SQL)
- TAVOLO DI CADUTA (Transact-SQL)
- RIPETI (Transact-SQL)
- SOVVENZIONE (Transact-SQL)
- INSERIMENTO (Transact-SQL)
- MERGE (Transact-SQL)
- OPEN (Transact-SQL)
- REVOCA (Transact-SQL)
- SELECT (Transact-SQL)
- Istruzioni SET (Transact-SQL)
- SET ANSI_DEFAULTS (Transact-SQL)
- @@TRANCOUNT (Transact-SQL)
- TAVOLA TRONCA (Transact-SQL)
- AGGIORNAMENTO (Transact-SQL)