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

Perché mysql salta alcuni ID di incremento automatico?

È un esempio di blocco dell'incremento automatico in InnoDB:poiché stai eseguendo 2 istruzioni contemporaneamente nella stessa sessione:il blocco auto inc è ottenuto dalla prima query e la generazione del valore di incremento automatico non è intercalata tra le istruzioni - questo è il punto di transazione.

Questo accadrà sempre in base alla progettazione:se così non fosse, il modo in cui funzionano le transazioni in InnoDB, beh, non funzionerebbe. La scalabilità con carichi di tipo OLTP sarebbe orribile in quanto ogni inserto dovrebbe attendere che ogni altro inserto venga terminato, eseguito il commit o, peggio, ripristinato.

Ad esempio:se il tuo primo inserto viene eseguito 5 volte più a lungo del secondo e non riesce e viene eseguito il rollback, il secondo viene comunque completato ed è stato eseguito il commit. Altrimenti, dovresti aspettare ea. query da completare dopo l'altra.

Se hai bisogno di ID sequenziali e assolutamente univoci, estraili da un'altra fonte. Le colonne AutoInc garantiscono semplicemente un valore univoco, non necessariamente una sequenza mono, che è un punto di serializzazione e un collo di bottiglia.

Un modo per aggirare questo se altrimenti richiesto:

imposta innodb_autoinc_lock_mode = 0 nel tuo my.cnf/mysql.ini

Descrizione di blocco automatico in InnoDB e Opzioni