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

MySQL Изберете... за актуализация с индекс има проблем с едновременността

От чисто теоретична гледна точка, изглежда, че не заключвате правилните редове (различно условие в първия израз, отколкото в изявлението за актуализиране; освен това заключвате само един ред поради LIMIT 1 , докато е възможно да актуализирате още редове по-късно).

Опитайте това:

START TRANSACTION;
SELECT v_id FROM v_ext WHERE username IS NULL AND v_id=yyy FOR UPDATE;
UPDATE v_ext SET username=xxx WHERE v_id=yyy;
COMMIT;

[редактиране]

Що се отнася до причината за вашата задънена улица, това е вероятният отговор (от ръководството ):

Без индекс, SELECT ... FOR UPDATE операторът вероятно ще заключи цялата таблица, докато с индекс той заключва само някои редове. Тъй като не сте заключили правилните редове в първия израз, по време на втория израз се придобива допълнително заключване.

Очевидно блокиране не може да се случи, ако цялата таблица е заключена (т.е. без индекс). Със сигурност може да възникне застой при втората настройка.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да вземем Count (*) като променлива от SQL към php?

  2. Инструкция InnoDB SELECT ... FOR UPDATE, заключваща всички редове в таблица

  3. MySQL 5.7 пропуска съвпадение с думи с два китайски символа

  4. Извличане на йерархия от таблица като тази

  5. Съвместно филтриране в MySQL?