sql >> Databasteknik >  >> RDS >> Mysql

Varför ökar MySQL autoinkrement vid misslyckade insättningar?

InnoDB är en transaktionsmotor.

Det betyder att i följande scenario:

  1. Session A infogar post 1
  2. Session B infogar post 2
  3. Session A rullar tillbaka

, det finns antingen en möjlighet till en lucka eller session B skulle låsa tills session A begått eller rullat tillbaka.

InnoDB designers (som de flesta andra transaktionsmotordesigners) valde att tillåta luckor.

Från dokumentationen :

När du kommer åt räknaren för automatisk ökning, InnoDB använder en speciell tabellnivå AUTO-INC lås som den behåller till slutet av nuvarande SQL uttalande, inte till slutet av transaktionen. Den speciella låsfrigöringsstrategin introducerades för att förbättra samtidigheten för insättningar i en tabell som innehåller en AUTO_INCREMENT kolumn

InnoDB använder den automatiska inkrementräknaren i minnet så länge servern körs. När servern stoppas och startas om, InnoDB återinitierar räknaren för varje tabell för den första INSERT till bordet, som beskrivits tidigare.

Om du är rädd för id kolumn omslutande, gör den till BIGINT (8-byte lång).



  1. SQL Server In-Memory OLTP:Grunderna

  2. 12.2 RAC/GI Nya funktioner

  3. Varför kan jag inte skapa utlösare på objekt som ägs av SYS?

  4. Londiste-replikering med PostgreSQL 9.0