Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do
AzureInstância
Gerenciada de SQL do AzureAzure Synapse Analytics
PDW (Analytics Platform System)
Warehouse no Microsoft Fabric
Banco de dados SQL no Microsoft Fabric
Define o BEGIN TRANSACTION modo como implícito, para a conexão.
Convenções de sintaxe de Transact-SQL
Sintaxe
SET IMPLICIT_TRANSACTIONS { ON | OFF }
Comentários
Quando ON, o sistema está em modo de transação implícita . Isso significa que se @@TRANCOUNT = 0, qualquer uma das seguintes instruções Transact-SQL inicia uma nova transação. É equivalente a um invisível BEGIN TRANSACTION ser executado primeiro:
ALTER TABLEBEGIN TRANSACTIONCREATEDELETEDROPFETCHGRANTINSERTMERGEOPENREVOKE-
SELECT( Veja observação esclarecedora) TRUNCATE TABLEUPDATE
Quando OFF, cada uma das instruções T-SQL anteriores é limitada por uma instrução invisível BEGIN TRANSACTION e uma invisible COMMIT TRANSACTION . Quando OFF, dizemos que o modo de transação é autocommit. Se seu código T-SQL emitir visivelmente um BEGIN TRANSACTION, dizemos que o modo de transação é explícito.
Há vários pontos esclarecedores para entender:
Quando o modo de transação está implícito, nenhum unseen
BEGIN TRANSACTIONé emitido, se@@TRANCOUNT > 0já for. No entanto, quaisquer afirmações explícitasBEGIN TRANSACTIONainda incrementam@@TRANCOUNT.Quando suas
INSERTextrações e qualquer outra coisa da sua unidade de trabalho estiverem concluídas, você deve emitirCOMMIT TRANSACTIONextratos até@@TRANCOUNTque seja decrementada de volta a 0. Ou você pode emitir umROLLBACK TRANSACTION.
SELECTInstruções que não selecionam de uma tabela não iniciam transações implícitas. Por exemplo,SELECT GETDATE();ouSELECT 1, 'ABC';não exigem transações.Transações implícitas podem ser
ONinesperadamente devido a inadimplências ANSI. Para mais detalhes, veja SET ANSI_DEFAULTS.Configurar
IMPLICIT_TRANSACTIONSparaONnão é popular. Na maioria dos casos ondeIMPLICIT_TRANSACTIONSéON, é porqueSET ANSI_DEFAULTS ONfoi definido.O Provedor de Base de Dados OLE para SQL Server Native Client do SQL Server e o driver ODBC do SQL Server Native Client são automaticamente configurados
IMPLICIT_TRANSACTIONSparaOFFao conectar. DefinaIMPLICIT_TRANSACTIONSos padrões paraOFFconexões com o provedor gerenciado SQLClient e para requisições SOAP recebidas via endpoints HTTP.
Para visualizar a configuração atual de IMPLICIT_TRANSACTIONS, execute a seguinte consulta.
DECLARE @IMPLICIT_TRANSACTIONS AS VARCHAR (3) = 'OFF';
IF ((2 & @@OPTIONS) = 2)
SET @IMPLICIT_TRANSACTIONS = 'ON';
SELECT @IMPLICIT_TRANSACTIONS AS IMPLICIT_TRANSACTIONS;
Exemplos
O script Transact-SQL a seguir é executado em alguns casos de teste diferentes. A saída de texto também é fornecida, mostrando o comportamento detalhado e os resultados de cada caso de teste.
-- 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
Next é a saída de texto do script Transact-SQL anterior.
-------- [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
Conteúdo relacionado
- ALTERAR TABELA (Transact-SQL)
- INICIAR TRANSAÇÃO (Transact-SQL)
- CRIAR TABELA (Transact-SQL)
- DELETE (Transact-SQL)
- MESA DE QUEDA (Transact-SQL)
- FETCH (Transact-SQL)
- SUBVENÇÃO (Transact-SQL)
- INSERT (Transact-SQL)
- MERGE (Transact-SQL)
- ABERTO (Transact-SQL)
- REVOGAR (Transact-SQL)
- SELECT (Transact-SQL)
- Instruções SET (Transact-SQL)
- CONJUNTO ANSI_DEFAULTS (Transact-SQL)
- @@TRANCOUNT (Transact-SQL)
- TABELA TRUNCADA (Transact-SQL)
- ATUALIZAÇÃO (Transact-SQL)