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

como bloquear alguma linha, pois elas não são selecionadas em outra transação


Parece que você precisa de algum tipo de marcador para identificar linhas como "em uso" para que as outras instâncias não processem os mesmos dados; se você usa um tipo booleano ou data é irrelevante, de alguma forma você deve marcar as linhas em uso.

Você pode fazer isso por meio de um dispatcher, um processo ou thread com acesso exclusivo à sua tabela e o único trabalho é selecionar linhas e passá-las para outros processos para trabalhar. Mesmo assim, o despachante terá que saber até onde os dados chegaram para que você volte ao mesmo problema.

Outra maneira é usar um campo para indicar que a linha está em uso (como você disse em sua pergunta). Cada processo atualiza um bloco de linhas com um ID único, realizado dentro de uma transação para travar a tabela; Eu usaria o número de conexão retornado de CONNECTION_ID() para marcá-los, então você sabe que é único.

Após o UPDATE ... WHERE connection_id IS NULL (com um limite aplicado) a transação está completa o processo pode SELECT ... WHERE connection_id = CONNECTION_ID() para obter suas linhas para processamento.

Quando eles completam seu trabalho, todo o ciclo começa novamente para marcar o próximo conjunto de linhas até que todas tenham sido processadas.