Devo tentar novamente uma consulta que falhou devido a um erro de conexão?

5

Digamos que eu queira adicionar uma linha a uma tabela.

Eu envio a consulta do cliente (o site, não o usuário) para o banco de dados que está em outro servidor físico. A consulta é enviada pela rede.

A consulta é executada com sucesso. O banco de dados, em seguida, envia uma mensagem de volta para o cliente dizendo que a consulta foi bem-sucedida. Neste momento, a rede falha e a mensagem nunca chega ao cliente.

Agora, o cliente não tem como saber se a consulta foi bem-sucedida ou não. Só sabe que perdeu conexão com o banco de dados.

Qual seria a melhor maneira de lidar com esse tipo de cenário?

Mesmo que a conexão seja restaurada, o problema ainda persiste.

Repetir a consulta é arriscado. A linha pode ser adicionada duas vezes. Na verdade, qualquer tipo de atualização pode acontecer duas ou mais vezes.

Tratar a consulta como "falhada" é enganadora. Informar ao usuário que a solicitação falhou pode ser um problema. O usuário pode tentar novamente fazer algo que já foi feito, como concluir uma compra.

    
por Marc-François 26.04.2018 / 22:51
fonte

2 respostas

4

Vamos supor um caso complexo, uma consulta que modifique um número desconhecido de registros, de uma maneira que não seja idempotente. E assumimos que é a conexão entre você e o banco de dados que dá errado, o próprio banco de dados está bem.

Você cria um ID exclusivo que entrará em uma tabela de transações. Em seguida, você envia uma consulta que adiciona o número exclusivo à tabela de transações e executa sua consulta original.

Se a consulta combinada nunca chegar ao servidor, o ID exclusivo não será adicionado às transações. Se a consulta for executada, o ID exclusivo estará na tabela de transações. Assim, para a nova tentativa, você apenas verifica se o ID único existe ou não.

Se a sua consulta deveria retornar resultados, você precisará de uma consulta alternativa que possa retornar os mesmos resultados, sem efeitos colaterais.

    
por 27.04.2018 / 02:06
fonte
1

Se este é um cenário em que você está preocupado, uma solução é criar sua própria chave única como chave primária ou em uma coluna com restrição de exclusividade. Então você pode tentar novamente e você terá uma falha porque o banco de dados não permitirá um valor duplicado. A abordagem geral é denominada 'detecção de transação duplicada'. Em muitos casos, isso não é uma preocupação, pois é altamente improvável e, se acontecer, o sistema não permitirá a revisão e a correção manuais. Ou, alternativamente, você tem um usuário final que pode verificar se o registro foi criado.

    
por 26.04.2018 / 23:04
fonte