Aggiornamento di tutti i record nella tabella MySQL mentre ancora disponibile per l'utente

1

Ho questo 'tavolo A'. Contiene due colonne; email e email_alias. Un esempio è di seguito:     ===================================== = email | email_alias = ===================================== = [email protected] | [email protected] = = [email protected] | [email protected] = = [email protected] | [email protected] = = [email protected] | [email protected] = = [email protected] | [email protected] = = [email protected] | [email protected] = = [email protected] | [email protected] = =====================================

Come puoi vedere, solo l'alias deve essere unico. Ad ogni modo, ho uno script che permetterà ad un utente di aggiornare questa tabella. In precedenza, avrei troncato l'intera tabella e quindi reinserire le ultime voci.     Problem: It's possible for a user to see an empty or incomplete list.

Il mio prossimo pensiero è stato quello di contrassegnare tutti i vecchi campi "da cancellare", inserire il nuovo, quindi tornare indietro ed eliminare le voci contrassegnate.     Problem: It's possible for the user to see duplicate entries.

Potrei dire if email = new.email & email_alias = new.email_alias, then do nothing, else, add record. Problem: Old records will still be present

Preferirei non farlo, ma è la mia unica opzione per creare una tabella temporanea? Rimuovere i record dalla vecchia tabella che non esistono nella tabella temporanea e aggiungere i record dalla tabella temporanea che non esistono nella vecchia tabella?

    
posta Antonio Anonymous 27.05.2016 - 19:22
fonte

3 risposte

1

Problem: It's possible for a user to see an empty or incomplete list.

Problem: It's possible for the user to see duplicate entries.

Sospetto che non stai utilizzando Transazioni quando esegui questi aggiornamenti.

Con Transazioni, gli utenti vedranno solo il risultato finale delle tue manipolazioni [transazionali]. mai vedranno lo stato intermedio in cui sono presenti i duplicati (o nessuna riga).

Begin transaction 
Insert/ Update/ Delete, as required 
Commit 

I cambiamenti transazionali dovrebbero essere rapidi perché molti DBMS bloccheranno l'accesso alle righe o alle tabelle su cui si lavora finché non verrà eseguito il commit (o il rollback).

    
risposta data 28.06.2016 - 13:17
fonte
0

Mi sono avvicinato applicando un delta. Per fare ciò nel database è possibile aggiungere una colonna flag che si modifica a ogni esecuzione. Gli aggiornamenti possono essere applicati in due passaggi.

  • Applica i nuovi dati invertendo il flag sui record esistenti che corrispondono e aggiungendo e nuovi record con il nuovo valore di flag.
  • Elimina tutti i record con il vecchio flag di valore.

Per limitare il numero di bloccato. record è possibile salvare le modifiche ogni 100 o 100 record.

Cerco di ridurre al minimo il set di modifiche. Se il set è abbastanza piccolo, puoi leggere le chiavi primarie in un elenco (mappa). Quindi, rimuovi le chiavi dall'elenco che corrisponde ai record del feed. Dopo aver elaborato il feed, utilizzare l'elenco per rimuovere i record eliminati dal feed. Utilizzando questo metodo, solo i nuovi (e modificati) record devono essere modificati.

    
risposta data 29.05.2016 - 00:19
fonte
0

Posso pensare a due modi per affrontare questo problema.

Se la lista è abbastanza piccola

... basta avvolgere l'aggiornamento in una transazione e impostare il livello di isolamento della transazione in modo che gli utenti che interrogano la tabella vengano bloccati fino al completamento dell'aggiornamento.

Se la lista è molto grande

... o ha relazioni complicate (probabilmente non si applica in questo caso specifico), aggiungi uno strato di riferimento indiretto, ad es.

  • Modifica la tua tabella utente con un "EmailListID" che è un FK nella tua tabella email
  • Modifica la tua tabella email aggiungendo una colonna "EmailListID". La chiave primaria della tua nuova tabella sarà
  • Quando recuperi l'elenco di email, aggiungi una clausola WHERE EmailListID = [User].EmailListID
  • Quando si aggiorna l'elenco, attenersi alla seguente procedura:
    1. Scegli una nuova mailListID
    2. Aggiungi la nuova versione dell'elenco email alla tabella email
    3. Aggiorna la tua tabella utente con il nuovo EmailListID
    4. Elimina la vecchia lista dalla tabella

Ciò consente di accedere alla vecchia versione dell'elenco mentre si effettua il costoso aggiornamento.

    
risposta data 28.06.2016 - 02:57
fonte

Leggi altre domande sui tag