От зависимостта от настройката на стойността на индексирана колона по-висока или по-ниска, изглежда, че заключването всъщност се поставя върху записа в индекса. Механизмът на базата данни сканира индекса и спира при първия заключен запис, чакайки той да бъде освободен.
Когато първата транзакция е ангажирана, индексът се отключва и чакащата транзакция продължава да сканира индекса. Тъй като стойността беше намалена, сега е по-рано в индекса. Така че възобновеното сканиране не го вижда, защото вече е преминало тази точка.
За да потвърдите това, опитайте следния тест:
- Създайте два реда със стойности 2 и 3.
- И в двете транзакции направете
SELECT ... FOR UPDATE
- В транзакция 1 променете 2 на 1, 3 на 4.
- Извършване на транзакция 1.
Ако предположението ми е правилно, транзакция 2 трябва да върне само реда с 4.
Това ми изглежда като грешка, тъй като не мисля, че някога трябва да получавате частични резултати като този. За съжаление е трудно да се търси това на bugs.mysql.com, тъй като думата "за" се игнорира при търсене, защото е твърде кратка или често срещана. Дори цитирането на "за актуализация" изглежда не намира грешки, които съдържат само тази фраза.