SELECT ... FOR UPDATE
verrouille la ou les lignes en mode exclusif, ce qui signifie que la deuxième sélection ne peut pas continuer tant que la première n'est pas terminée ou annulée. En effet, le résultat de la deuxième sélection peut être affecté par le contenu de la ligne que vous avez verrouillée, il doit donc obtenir un verrou en lecture sur la ligne à vérifier.
Si vous créez un UNIQUE INDEX
sur par exemple id
, vous pourriez faire ;
select * from SolrCoresPreallocated where id=1 for update;
dans la première transaction et ;
select * from SolrCoresPreallocated where id=2 for update;
dans le second indépendamment, puisque l'index unique permet au second select de trouver la ligne correcte sans verrouiller en lecture la première.
EDIT :Pour obtenir une ligne "gratuite" le plus rapidement possible, le seul moyen est vraiment de faire deux transactions ;
- BEGIN/SELECT FOR UPDATE/UPDATE to busy/COMMIT pour obtenir la ligne.
- BEGIN/
/UPDATE to free/COMMIT pour traiter la ligne et la libérer.
Cela signifie que vous pourriez avoir besoin d'actions de compensation en cas d'échec d'un processus et d'annulation de la transaction qui mettrait à jour la ligne pour la libérer, mais puisque MySQL (ou SQL standard d'ailleurs) n'a pas la notion de "obtenir la prochaine ligne déverrouillée ", vous n'avez pas beaucoup d'options.