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:
- Vytvořte dva řádky s hodnotami 2 a 3.
- V obou transakcích proveďte
SELECT ... FOR UPDATE
- V transakci 1 změňte 2 na 1, 3 na 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.