Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL select for update връща празен набор, въпреки че съществува ред

От зависимостта от настройката на стойността на индексирана колона по-висока или по-ниска, изглежда, че заключването всъщност се поставя върху записа в индекса. Механизмът на базата данни сканира индекса и спира при първия заключен запис, чакайки той да бъде освободен.

Когато първата транзакция е ангажирана, индексът се отключва и чакащата транзакция продължава да сканира индекса. Тъй като стойността беше намалена, сега е по-рано в индекса. Така че възобновеното сканиране не го вижда, защото вече е преминало тази точка.

За да потвърдите това, опитайте следния тест:

  1. Създайте два реда със стойности 2 и 3.
  2. И в двете транзакции направете SELECT ... FOR UPDATE
  3. В транзакция 1 променете 2 на 1, 3 на 4.
  4. Извършване на транзакция 1.

Ако предположението ми е правилно, транзакция 2 трябва да върне само реда с 4.

Това ми изглежда като грешка, тъй като не мисля, че някога трябва да получавате частични резултати като този. За съжаление е трудно да се търси това на bugs.mysql.com, тъй като думата "за" се игнорира при търсене, защото е твърде кратка или често срещана. Дори цитирането на "за актуализация" изглежда не намира грешки, които съдържат само тази фраза.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. innodb_lock_wait_timeout увеличава времето за изчакване

  2. Трябва да се покаже МАКСИМАЛЕН БРОЙ от общия брой клиенти чрез сравняване на две таблици

  3. Как да получа дата за следващия месец от днешната дата и да я вмъкна в моята база данни?

  4. Python pandas to_sql 'append'

  5. Python:Как да инсталирам mysqldb на Windows 7 x64?