sql >> Databáze >  >> RDS >> Mysql

MySQL select for update vrací prázdnou sadu, i když řádek existuje

Ze závislosti na nastavení vyšší nebo nižší hodnoty indexovaného sloupce to vypadá, že zámek je skutečně umístěn na položku indexu. Databázový stroj prohledá index a zastaví se u prvního uzamčeného záznamu a čeká na jeho uvolnění.

Když je potvrzena první transakce, index se odemkne a čekající transakce pokračuje ve skenování indexu. Protože byla hodnota snížena, je nyní v indexu dříve. Obnovené skenování to tedy nevidí, protože tímto bodem již prošlo.

Chcete-li to potvrdit, vyzkoušejte následující test:

  1. Vytvořte dva řádky s hodnotami 2 a 3.
  2. V obou transakcích proveďte SELECT ... FOR UPDATE
  3. V transakci 1 změňte 2 na 1, 3 na 4.
  4. Potvrdit transakci 1.

Pokud je můj odhad správný, transakce 2 by měla vrátit pouze řádek se 4.

Zdá se mi to jako chyba, protože si nemyslím, že byste někdy měli získat dílčí výsledky, jako je tento. Bohužel je těžké to hledat na bugs.mysql.com, protože slovo „pro“ je při vyhledávání ignorováno, protože je příliš krátké nebo běžné. Zdá se, že ani citace „pro aktualizaci“ nenajde chyby, které obsahují pouze tuto frázi.




  1. MySQL automatické přetypování řetězce na celé číslo v klauzuli where?

  2. Rozdělení řetězce na serveru SQL

  3. Volání procedury uvnitř funkce vyvolá chybu MySQL 1422

  4. Jak používat mysqlimport ke čtení výsledku mysqldump --databases