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

Минимален пример за използване на select... за актуализиране за изолиране на редове

SELECT ... FOR UPDATE заключва реда/редовете в изключителен режим, което означава, че вторият избор не може да продължи, докато първият не завърши или не се върне назад. Това е така, тъй като резултатът от втория избор може да бъде повлиян от съдържанието на реда, който сте заключили, така че трябва да получи заключване за четене на реда, за да провери.

Ако създадете UNIQUE INDEX на например id , бихте могли да направите;

select * from SolrCoresPreallocated where id=1 for update;

в първата транзакция и;

select * from SolrCoresPreallocated where id=2 for update;

във втория независимо, тъй като уникалният индекс позволява на втория избор да намери правилния ред, без да блокира първия.

РЕДАКТИРАНЕ:За да получите „безплатен“ ред възможно най-бързо, единственият начин наистина е да направите две транзакции;

  • BEGIN/SELECT FOR UPDATE/UPDATE за зает/COMMIT, за да получите реда.
  • BEGIN//UPDATE за освобождаване/COMMIT за обработка на реда и освобождаване.

Това означава, че може да се нуждаете от компенсиращи действия в случай, че процесът се провали и върне транзакцията, която би АКТУАЛИЗИРАЛА реда до свободен, но тъй като MySQL (или стандартен SQL за този въпрос) няма понятие „получи следващия отключен ред ", нямате много опции.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel Delete Query Builder

  2. MySQL:SELECT ще проучи повече от MAX_JOIN_SIZE реда

  3. Поддръжка на Homebrew, MySQL 8

  4. PyInstaller, файл със спецификации, ImportError:Няма модул с име 'blah'

  5. Най-лесният начин за PHP връзка за проверка на имейл