Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Exemplo mínimo de uso select... for update para isolar linhas


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.