Devo riprovare una query non riuscita a causa di un errore di connessione?

5

Diciamo che voglio aggiungere una riga a un tavolo.

Invio la query dal client (il sito Web, non l'utente) al database che si trova su un altro server fisico. La query viene inviata tramite la rete.

La query è stata eseguita correttamente. Il database quindi invia un messaggio al client dicendo che la query è riuscita. In questo momento, la rete non riesce e il messaggio non raggiunge mai il client.

Ora, il client non ha modo di sapere se la query è riuscita o meno. Sa solo che ha perso la connessione con il database.

Quale sarebbe il modo migliore per gestire questo tipo di scenario?

Anche se la connessione viene ripristinata, il problema persiste ancora.

Ritentare la query è rischioso. La riga potrebbe essere aggiunta due volte. In effetti, qualsiasi tipo di aggiornamento potrebbe verificarsi due o più volte.

Trattare la query come "non riuscita" è fuorviante. Dire all'utente che la richiesta non è riuscita potrebbe essere un problema. L'utente potrebbe riprovare a fare qualcosa che è già stato fatto, come il completamento di un acquisto.

    
posta Marc-François 26.04.2018 - 22:51
fonte

2 risposte

4

Supponiamo un caso complesso, una query che modifica un numero sconosciuto di record, in un modo non idempotente. E supponiamo che sia la connessione tra te e il database che va storto, il database stesso va bene.

Crea un ID univoco che andrà in una tabella di transazioni. Quindi si invia una query che aggiunge il numero univoco alla tabella delle transazioni, quindi si esegue la query originale.

Se la query combinata non ha mai raggiunto il server, l'ID univoco non viene aggiunto alle transazioni. Se la query viene eseguita, l'ID univoco si trova nella tabella delle transazioni. Quindi, per riprovare, basta controllare se l'ID univoco è lì o meno.

Se la tua query dovesse restituire risultati, avrai bisogno di una query alternativa che possa restituire gli stessi risultati, senza effetti collaterali.

    
risposta data 27.04.2018 - 02:06
fonte
1

Se questo è uno scenario che ti interessa, una soluzione è creare la tua chiave univoca come chiave primaria o in una colonna con un vincolo di unicità. Quindi è possibile riprovare e si otterrà un errore perché il DB non consentirà un valore duplicato. L'approccio generale è definito 'rilevamento di transazioni duplicate'. In molti casi, questo non è un problema poiché è altamente improbabile e, se dovesse accadere, il sistema non consentirà la revisione manuale e la riparazione. In alternativa, hai un utente finale che può controllare se il record è stato creato.

    
risposta data 26.04.2018 - 23:04
fonte

Leggi altre domande sui tag