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 за този въпрос) няма понятие „получи следващия отключен ред ", нямате много опции.