Costumo ver instruções como registros de log do servidor sql a cada transação e operação.
Mas eu estou confuso sobre o que acontece quando uma transação é finalmente rolou para trás .
Diga uma transação explícita tem 3 afirmações: statement A
, statement B
, statement C
, e finalmente um rollback
statement D
.
Agora diga que quando a execução não atingir o rollback statement D
, as modificações resultantes serão statements A through C
registradas no log do servidor sql?
Compreensão 1 :
As frases A a D são todas gravadas. O SQL Server registra tudo, não importa o quê.
Noções sobre 2 : As modificações são armazenadas apenas em algum lugar da memória e registradas apenas para o log quando o SQL Server vê uma commit
instrução. Se for uma rollback
declaração, o SQL Server simplesmente ignora a transação, nenhuma gravação no log acontece porque não serve para nada. Em outras palavras, o SQL Server registra quando há um resultado líquido antes e depois das transações.
Ambos parecem lógicos, pelo menos para mim, mas eles não podem estar certos. Obrigado por qualquer ajuda.
fonte
Respostas:
O entendimento 1 está correto. O SQL Server registra todas as operações que alteram dados para o log de transações. Uma reversão é uma alteração nos dados, portanto, ela também registra isso no log de transações. Como a instrução A run, ela grava dados no log de transações e também reserva os dados no log de transações, caso a instrução A precise ser revertida. O mesmo vale para B e C. Quando você reverte a transação, mais informações serão gravadas no log.
Existem várias maneiras de ver isso em ação. Abaixo, uma demonstração rápida. Aqui está a consulta que usarei para ver o que foi gravado no log:
Minha mesa:
A consulta A usa log mínimo:
Após um:
A consulta B não usa log mínimo:
Depois de B:
A consulta C altera menos dados:
Após C:
Agora vou emitir um
ROLLBACK
e consultar o DMV enquanto a reversão acontece. Abaixo está uma tabela com alguns instantâneos:Durante o
ROLLBACK
, os bytes usados aumentam e o número reservado de bytes diminui. Isso ocorre porque o SQL Server está usando o espaço reservado anteriormente para desfazer a transação. Para desfazer a transação, ele deve alterar os dados para gravar mais dados no log.fonte
As modificações nas tabelas do banco de dados são gravadas primeiro no arquivo de log, depois nas próprias tabelas, primeiro na memória e, em seguida, com um processo assíncrono chamado
CHECKPOINT
, no disco. Esse mecanismo é conhecido como WAL (Write-Ahead Logging) e é comum a todos os bancos de dados relacionais.O próprio log é gravado primeiro na memória (no buffer do log, precisamente) e depois no disco, mas nada é tocado nas tabelas do banco de dados até que o log seja gravado no disco.
Esse mecanismo permite reverter transações confirmadas e reverter transações não confirmadas durante o processo de recuperação. Em relação ao seu exemplo, se algo ruim acontecesse depois
statement C
e você tivesse um emcommit
vez de umrollback
(você não pode saber isso com antecedência), sem salvar todas as etapas da transação, o RDBMS não teria como recuperar o banco de dados de maneira consistente. e a transação não atenderia aD
(durabilidade) emACID
.Quando algumas operações são revertidas, é o arquivo de dados que recebe as alterações líquidas (via
CHECKPOINT
), não o arquivo de log.fonte
O entendimento 1 está correto, e spaghettidba e Joe têm boas explicações.
Se você estiver interessado em testar você mesmo (em uma instância de teste), use o script abaixo:
Você verá que o SQL Server registra tudo, até as etapas executadas para desfazer operações.
fonte