Transações de confirmação automática
O modo de confirmação automática é o modo padrão de gerenciamento de transações do Mecanismo de banco de dados do SQL Server. Toda instrução Transact-SQL é confirmada ou revertida quando concluída. Se uma instrução for concluída com sucesso, será confirmada; se encontrar qualquer erro, será revertida. Uma conexão para uma instância do Mecanismo de Banco de Dados opera em modo de confirmação automática sempre que esse modo padrão não for substituído por transações explícitas ou implícitas. O modo de confirmação automática também é o modo padrão para ADO, OLE DB, ODBC e DB-Library.
Uma conexão a uma instância do Mecanismo de Banco de Dados opera em modo de confirmação automática até que uma instrução BEGIN TRANSACTION inicie uma transação explícita, ou que uma transação implícita seja definida como ativada. Quando a transação explícita é confirmada ou revertida, ou quando o modo de transação implícito é desativado, a conexão retorna ao modo de confirmação automática.
Quando ON, SET IMPLICIT_TRANSACTIONS define a conexão como modo de transação implícita. Quando OFF, ele retorna a conexão para o modo de transação de confirmação automática.
Erros de compilação e de tempo de execução
No modo de confirmação automática, às vezes parece que uma instância do Mecanismo de Banco de Dados reverteu um lote inteiro, em vez de apenas uma instrução SQL. Isto acontece se o erro encontrado for um erro de compilação, não um erro em tempo de execução. Um erro de compilação impede o Mecanismo de Banco de Dados de criar um plano de execução, assim nada no lote é executado. Embora pareça que todas as instruções antes daquela que gerou o erro tenham sido revertidas, o erro impediu que tudo no lote fosse executado. No exemplo a seguir, nenhuma das instruções INSERT no terceiro lote foram executadas por causa de um erro de compilação. Parece que as primeiras duas instruções INSERT foram revertidas, mas elas nunca foram executadas.
USE AdventureWorks2008R2;
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBatch VALUSE (3, 'ccc'); -- Syntax error.
GO
SELECT * FROM TestBatch; -- Returns no rows.
GO
No exemplo a seguir, a terceira instrução INSERT gera um erro de duplicação de chave primária em tempo de execução. As primeiras duas instruções INSERT têm êxito e são confirmadas; portanto, elas permanecem depois do erro em tempo de execução.
USE AdventureWorks2008R2;
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBatch VALUES (1, 'ccc'); -- Duplicate key error.
GO
SELECT * FROM TestBatch; -- Returns rows 1 and 2.
GO
O Mecanismo de Banco de Dados usa resolução de nome adiada, na qual os nomes de objetos não são resolvidos até o tempo de execução. No exemplo a seguir, as primeiras duas instruções INSERT são executadas e confirmadas, e essas duas linhas permanecem na tabela TestBatch, depois que a terceira instrução INSERT gera um erro em tempo de execução, referindo-se a uma tabela que não existe.
USE AdventureWorks2008R2;
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBch VALUES (3, 'ccc'); -- Table name error.
GO
SELECT * FROM TestBatch; -- Returns rows 1 and 2.
GO