sql >> Databasteknik >  >> RDS >> Mysql

låser detta databasen?

För mig är dokumentationen lite otydlig:

Interna låsmetoder föreslår att det under vissa omständigheter är möjligt att infoga i en MyISAM-tabell medan en annan session läser från den:

Men Tabelllåsningsproblem visar en situation där tabellen kommer att vara låst tills SELECT är klar (detta stämmer med din situation):

InnoDB-tabell implementerar lås på radnivå, så bara raden som läses kommer att låsas, snarare än hela tabellen.

I stället för att bara lita på dokumentationen testade jag ett litet test:

  1. Skapa två tabeller med samma struktur:table_a och table_b .
  2. Fyll table_a med 500 000 rader.
  3. Kopiera data från table_a till table_b med en INSERT INTO ... SELECT uttalande.
  4. Under kopieringsprocessen, använd en annan session för att infoga en ny rad i table_a .
  5. Kontrollera om table_b innehåller det nya rekordet.

När båda tabellerna var MyISAM, table_b innehöll inte den nya posten efter kopian. När båda tabellerna var InnoDB, table_b innehöll den nya posten efter kopian. Jag har upprepat detta tre gånger, och som förväntat blev resultatet detsamma varje gång.

Så kort sagt, om ditt bord är MyISAM kommer det att vara låst. Om det är InnoDB kommer det inte att göra det. Naturligtvis tar det här testet inte hänsyn till uppdateringar, men jag förväntar mig att resultaten kommer att bli liknande.




  1. Hur gör rapporter med specifika datumintervall i mysql

  2. Bästa sättet att söka efter befintlig användare i mySQL-databasen?

  3. MySQLSyntaxErrorException vid försök att köra PreparedStatement

  4. PDO MySQL säkerhetskopiering funktion