sql >> Databasteknik >  >> RDS >> Mysql

INSERT ... SELECT, InnoDB och låsning

Det stämmer. Raderna i tabellen som läses från är låsta med ett delat lås (SELECT är implicit LÅS I DELNINGSLÄGE ). Det finns inget sätt att undvika detta. Det är ungefär vad du ber systemet om:kopiera alla rader som matchar ett villkor. Det enda sättet att säkerställa att det faktiskt är alla rader som matchar villkoret och att listan inte ändras under eller omedelbart efter körningen av den satsen, är att låsa raderna.

Som ett förtydligande angående varför du inte kan INSERT med group_id =2 :

Detta har att göra med att din fråga specifikt är WHERE group_id =3 OCH skapad <'2014-01-04'KEY group_id_created (grupp-id, skapad) . För att söka alla rader som matchar group_id =3 OCH skapade <'2014-01-04' indexet kommer att gås baklänges med början med den första raden som överskrider det villkoret den övre gränsen, vilket är (3, '2014-01-14') och fortsätter tills du hittar en rad som inte matchar villkoret som sedan skapades har ingen nedre gräns blir den första raden där grupp-id <3 vilket naturligtvis är group_id =2 .

Det betyder att den första raden påträffades med group_id =2 är också låst, vilket kommer att vara raden med maximalt skapat värde. Detta gör det omöjligt att INSERT i "gapet" mellan (2, MAX(skapat)) och (3, MIN(skapad)) (inte korrekt SQL såklart, bara pseudo-SQL), även om detta inte är ett "gap lock" specifikt.




  1. 2 sätt att lista alla funktioner i MySQL

  2. Förlorade anslutningen till MySQL-servern vid "läsning av initialt kommunikationspaket", systemfel:0

  3. Hur kör man flera SQL-frågor i MySQL Workbench?

  4. Sammansatt FULLTEXT-index i MySQL