sql >> Databasteknik >  >> RDS >> Mysql

MySQL-val för uppdatering returnerar tom uppsättning även om det finns en rad

Från beroendet av att sätta värdet på en indexerad kolumn högre eller lägre, ser det ut som att låset faktiskt placeras på indexposten. Databasmotorn skannar indexet och stannar vid den första låsta posten och väntar på att den ska släppas.

När den första transaktionen har genomförts låses indexet upp och den väntande transaktionen fortsätter att skanna indexet. Eftersom värdet sänktes ligger det nu tidigare i indexet. Så den återupptagna skanningen ser den inte eftersom den redan har passerat den punkten.

För att bekräfta detta, prova följande test:

  1. Skapa två rader med värdena 2 och 3.
  2. I båda transaktionerna gör du SELECT ... FOR UPDATE
  3. I transaktion 1, ändra 2 till 1, 3 till 4.
  4. Beslut transaktion 1.

Om min gissning är korrekt, bör transaktion 2 returnera bara raden med 4.

Detta verkar vara en bugg för mig, eftersom jag inte tror att du någonsin ska få partiella resultat som detta. Tyvärr är det svårt att söka efter detta på bugs.mysql.com, eftersom ordet "för" ignoreras när man söker eftersom det är för kort eller vanligt. Ens att citera "för uppdatering" verkar inte hitta buggar som bara innehåller denna fras.




  1. Infoga i 2 tabeller med PDO MySQL

  2. Hur man ansluter SalesForce som en datakälla i Pyramid

  3. Beräkna ålder från födelsedag med oracle plsql trigger och infoga åldern i tabellen

  4. Kombinera 2 SELECT-frågor