Mysql
 sql >> Database >  >> RDS >> Mysql

Impedisci la lettura durante l'aggiornamento della tabella

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.