Imagine que estou executando vários lotes pelo estúdio de gerenciamento, separados pelo comando GO. Eu gostaria de saber como as transações implícitas se comportarão - a transação é confirmada por lote ou uma vez para toda a execução.
relate perguntas
-
SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado
-
Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?
-
Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?
-
Quais são as principais causas de deadlocks e podem ser evitadas?
-
Como determinar se um Índice é necessário ou necessário
O que exatamente você quer dizer com "transações implícitas"? Você quer dizer que tem a propriedade de sessão de IMPLICIT_TRANSACTIONS habilitada e está usando esse recurso? Ou você quer dizer que você simplesmente não está especificando
BEGIN TRANSACTION
? (ou seja, criando uma transação "explícita")?Se você está se referindo ao
IMPLICIT_TRANSACTIONS
recurso, isso simplesmente emite oBEGIN TRAN
e nada mais. Portanto, se você está usando ou nãoIMPLICIT_TRANSACTIONS
para emitir oBEGIN TRAN
ou se você está fazendo isso explicitamente, você ainda é responsável por emitir oCOMMIT
ouROLLBACK
. E sim, as transações podem abranger lotes, quer você esteja usandoGO
para separar lotes ou executando várias consultas pressionandoF5
em momentos diferentes.Em ambos os casos --
IMPLICIT_TRANSACTIONS
definido comoON
ou uma declaração explícitaBEGIN TRAN
-- nada é confirmado automaticamente. A única coisa que pode ser automática nesses dois casos éROLLBACK
se você fechar a conexão sem emitir oCOMMIT
ouROLLBACK
primeiro.Sem
IMPLICIT_TRANSACTIONS
definir paraON
ou uma instrução explícitaBEGIN TRAN
, cada consulta individual é sua própria transação, que é "auto-commitida" e você não precisa se preocupar com isso. Ou seja, 2INSERT
declarações separadas são duas transações completamente separadas.As transações implícitas (também conhecidas como modo de transação encadeada) abrangem lotes; o
go
comando não tem efeito sobre o status de sua transação.Consulte SET IMPLICIT_TRANSACTIONS para alguns exemplos que incluem transações abrangendo lotes (ou seja, abrangendo o
go
comando).Nem mesmo. Eles são por instrução de acordo com o padrão SQL.
O que significa que um lote que é executado, por exemplo, em um loop, não é executado em uma transação, mas cada instrução é sua própria transação atômica.