Se uma transação for "confirmada", ela será salva com certeza?

12

Se uma transação for confirmada com êxito, posso ter 100% de certeza de que ela foi gravada no banco de dados E nos arquivos de log? Posso ter certeza de que os dados estão salvos?

Hoje, nossos arquivos de log atingiram o limite da unidade e tivemos muitos erros. Além disso, alguns outros serviços falharam. Aumentamos o disco e reiniciou o servidor.

Durante a inicialização, o servidor fez uma "recuperação do banco de dados" - posso ter certeza de que está tudo bem novamente?

Polícia SQL
fonte
2
Você pode verificar o log de erros após a conclusão da recuperação para ver quantas transações foram confirmadas e quantas foram revertidas. Não há resposta mágica para isso - se um disco travou, tudo depende do estado das transações naquele momento.
Aaron Bertrand
1
@AaronBertrand Mas se uma transação estiver no estado "confirmada" (ou seja, a confirmação foi bem-sucedida), como seria possível que ainda se perdesse durante a recuperação?
SQL Police
3
@Giosco: Não pode. "confirmado" significa que ele está no arquivo de log do banco de dados. A única maneira de perdê-lo depois disso é 1) perder o arquivo de log antes de também ser salvo no arquivo de dados ou 2) perder o arquivo de log e o arquivo de dados ou 3) erro humano. Observe que (3) é geralmente o mais provável.
usar o seguinte código
2
@Giosco, como você sabe que todas as suas transações no momento da unidade completa foram confirmadas com êxito?
Aaron Bertrand
2
Transação de procedimento armazenado <> - seu procedimento armazenado pode ter várias transações explícitas, ou apenas implícitas, pode haver lógica try / catch, pode haver manipulação de transação na camada C #, etc. etc. Novamente, assumindo que nenhuma exceção = confirmação bem-sucedida pode ser um pouco perigoso demais como uma declaração geral.
Aaron Bertrand

Respostas:

16

Se um aplicativo cliente emitiu um COMMIT e recebeu um código de sucesso, a transação garante que a transação seja durável. É garantido que todas as alterações feitas em uma transação sejam visíveis, mesmo após uma falha. Além disso, a recuperação também garante que qualquer transação não confirmada será revertida em caso de falha.

Para mais detalhes, recomendo a leitura do artigo ARIES .

O registro e a recuperação write-ahead não podem garantir se o hardware de armazenamento subjacente apresentar falhas (corrupção). E qualquer produto de engenharia pode conter defeitos.

Seu aplicativo, como todos os outros aplicativos, precisa ser cuidadosamente escrito para se comportar corretamente na presença de falhas (erros). Não há mágica.

Remus Rusanu
fonte
Se um aplicativo cliente emitiu um COMMIT, mas nenhuma resposta do DB foi recebida até o tempo limite no lado do cliente. E esse commit? sucesso ou fracasso? Como verificar?
Gab是好人