Existem quatro modos de transação no SQL Server. Um deles é o modo implícito.
No SQL Server, uma transação implícita é quando uma nova transação é iniciada implicitamente quando a transação anterior é concluída, mas cada transação é explicitamente concluída com um
COMMIT ou ROLLBACK demonstração. Isso não deve ser confundido com o modo de confirmação automática, onde a transação é iniciada e encerrada implicitamente.
Os quatro modos de transação
O SQL Server pode operar nos seguintes modos de transação:
| Modo de transação | Descrição |
|---|---|
| Transação de confirmação automática | Cada extrato individual é uma transação. |
| Transação implícita | Uma nova transação é iniciada implicitamente quando a transação anterior é concluída, mas cada transação é explicitamente concluída, normalmente com um COMMIT ou ROLLBACK declaração dependendo do DBMS. |
| Transação explícita | Iniciado explicitamente com uma linha como START TRANSACTION , BEGIN TRANSACTION ou similar, dependendo do DBMS, e explicitamente confirmado ou revertido com as instruções relevantes. |
| Transação com escopo de lote | Aplicável apenas a vários conjuntos de resultados ativos (MARS). Uma transação explícita ou implícita que começa em uma sessão MARS se torna uma transação com escopo de lote. |
Modo implícito x confirmação automática
No SQL Server, determinadas instruções iniciam uma transação automaticamente quando são executadas. É como se eles fossem precedidos por um
BEGIN TRANSACTION invisível demonstração. Na maioria dos casos, essas transações também são confirmadas implicitamente, como se houvesse um
COMMIT TRANSACTION invisível demonstração. Diz-se que essas transações estão no modo de confirmação automática . Em outros casos, não há
COMMIT TRANSACTION invisível para corresponder ao invisível BEGIN TRANSACTION demonstração. A transação permanece em andamento até que você a confirme explicitamente ou a reverta com um COMMIT TRANSACTION ou ROLLBACK TRANSACTION demonstração. Nesse caso, diz-se que a transação está no modo implícito . Se a transação é executada no modo implícito ou no modo de confirmação automática, depende do seu
IMPLICIT_TRANSACTIONS contexto. Declarações que iniciam uma transação implícita
As instruções a seguir iniciam uma transação implícita no SQL Server.
ALTER TABLEBEGIN TRANSACTIONCREATEDELETEDROPFETCHGRANTINSERTOPENREVOKESELECT(exceto aqueles que não selecionam de uma tabela, comoSELECT GETDATE()ouSELECT 1*1)TRUNCATE TABLEUPDATE
Sempre que você executa essas instruções T-SQL, está iniciando uma transação. Na maioria das vezes, a transação será confirmada automaticamente. Então você iniciou e finalizou a transação sem precisar fazer isso explicitamente.
No entanto, dependendo do seu
IMPLICIT_TRANSACTIONS configuração, pode ser necessário confirmar a transação explicitamente. Quando IMPLICIT_TRANSACTIONS está OFF
Quando seu
IMPLICIT_TRANSACTIONS configuração é OFF , as instruções acima realizam transações no modo de confirmação automática. Ou seja, eles começam e encerrar a transação implicitamente. É como ter um
BEGIN TRANSACTION invisível instrução e um invisível COMMIT TRANSACTION declaração, tudo a partir de uma declaração. Nesse caso, você não precisa fazer nada para confirmar ou reverter a transação. Já foi feito para você.
Quando IMPLICIT_TRANSACTIONS está ON
Quando seu
IMPLICIT_TRANSACTIONS configuração está ON , as instruções acima se comportam um pouco diferente. Quando
IMPLICIT_TRANSACTIONS configuração está ON , as instruções acima recebem um BEGIN TRANSACTION invisível mas não recebem um COMMIT TRANSACTION correspondente demonstração. Isso significa que você mesmo precisa confirmar ou reverter a transação explicitamente.
No entanto, quando o modo de transação está implícito, nenhum
BEGIN TRANSACTION invisível é emitido se uma transação já estiver em andamento. Exemplo
Aqui está um exemplo para demonstrar o conceito.
SELECT @@TRANCOUNT AS TransactionCount;
SET IMPLICIT_TRANSACTIONS OFF;
SELECT TOP 1 ProductName, ProductPrice FROM Products;
SELECT @@TRANCOUNT AS TransactionCount; Resultado:
+--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected) Commands completed successfully. +-------------------------+----------------+ | ProductName | ProductPrice | |-------------------------+----------------| | Left handed screwdriver | 25.99 | +-------------------------+----------------+ (1 row affected) +--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected)
Nesse caso, defino
IMPLICIT_TRANSACTIONS para OFF e execute o SELECT demonstração. Isso significava que o SELECT A instrução foi executada no modo de confirmação automática e, portanto, a transação foi iniciada e encerrada implicitamente. @@TRANCOUNT retornou 0 , o que significa que não havia transações em execução naquele momento. Aqui está novamente, exceto que desta vez definimos
IMPLICIT_TRANSACTIONS para ON . SELECT @@TRANCOUNT AS TransactionCount;
SET IMPLICIT_TRANSACTIONS ON;
SELECT TOP 1 ProductName, ProductPrice FROM Products;
SELECT @@TRANCOUNT AS TransactionCount; Resultado:
+--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected) Commands completed successfully. +-------------------------+----------------+ | ProductName | ProductPrice | |-------------------------+----------------| | Left handed screwdriver | 25.99 | +-------------------------+----------------+ (1 row affected) +--------------------+ | TransactionCount | |--------------------| | 1 | +--------------------+ (1 row affected)
O último
@@TRANCOUNT está retornando um valor de 1 . Isso significa que nossa transação ainda está em andamento. @@TRANCOUNT retorna o número de BEGIN TRANSACTION instruções que ocorreram na conexão atual. Não emitimos um explicitamente, mas um foi emitido implicitamente. Então, na verdade, precisamos confirmar essa transação (ou revertê-la) para diminuir o
@@TRANCOUNT até 0 . COMMIT TRANSACTION;
SELECT @@TRANCOUNT AS TransactionCount; Resultado:
+--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected)
Portanto, o código para nossa transação implícita deve incluir o
COMMIT demonstração:SELECT @@TRANCOUNT AS TransactionCount;
SET IMPLICIT_TRANSACTIONS ON;
SELECT TOP 1 ProductName, ProductPrice FROM Products;
COMMIT TRANSACTION;
SELECT @@TRANCOUNT AS TransactionCount; Resultado:
+--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected) Commands completed successfully. +-------------------------+----------------+ | ProductName | ProductPrice | |-------------------------+----------------| | Left handed screwdriver | 25.99 | +-------------------------+----------------+ (1 row affected) Commands completed successfully. +--------------------+ | TransactionCount | |--------------------| | 0 | +--------------------+ (1 row affected)
ANSI_DEFAULTS
Se você achar que as transações implícitas estão habilitadas inesperadamente, pode ser por causa do
ANSI_DEFAULTS contexto.