Supponendo che utilizzi un motore transazionale (di solito Innodb), svuota e riempi la tabella nella stessa transazione.
Assicurati che i tuoi lettori utilizzino READ_COMMITTED o un livello di isolamento delle transazioni superiore (l'impostazione predefinita è REPEATABLE READ che è più alto).
In questo modo i lettori continueranno a leggere i vecchi contenuti della tabella durante l'aggiornamento.
Ci sono alcune cose a cui prestare attenzione:
- Se la tabella è così grande da esaurire l'area di rollback, ciò è possibile se aggiorni l'intera (diciamo) una tabella di righe da 1 milione. Ovviamente questo è sintonizzabile ma ci sono dei limiti
- Se la transazione non riesce a metà e viene ripristinata, il rollback di transazioni di grandi dimensioni è MOLTO inefficiente in InnoDB (è ottimizzato per i commit, non per i rollback)
- Fai attenzione ai deadlock e ai timeout di attesa dei blocchi, che sono più probabili se utilizzi grandi transazioni.