SELECT ... FOR UPDATE
bloqueia a(s) linha(s) no modo exclusivo, o que significa que a segunda seleção não pode continuar até que a primeira seja concluída ou revertida. Isso ocorre porque o resultado da segunda seleção pode ser afetado pelo conteúdo da linha que você bloqueou, portanto, é necessário obter um bloqueio de leitura na linha para verificar. Se você criar um
UNIQUE INDEX
por exemplo id
, você poderia fazer; select * from SolrCoresPreallocated where id=1 for update;
na primeira transação e;
select * from SolrCoresPreallocated where id=2 for update;
no segundo de forma independente, já que o índice exclusivo permite que o segundo select encontre a linha correta sem bloquear a leitura do primeiro.
EDIT:Para obter uma linha "livre" o mais rápido possível, a única maneira é realmente fazer duas transações;
- BEGIN/SELECT FOR UPDATE/UPDATE para ocupado/COMMIT para obter a linha.
- BEGIN/
/UPDATE to free/COMMIT para processar a linha e liberá-la.
Isso significa que você pode precisar de ações de compensação caso um processo falhe e reverta a transação que atualizaria a linha para livre, mas como o MySQL (ou SQL padrão para esse assunto) não tem a noção de "obter a próxima linha desbloqueada ", você não tem muitas opções.