EF núcleo de simultaneidade quando usando várias instâncias

0

Pergunta

Eu tenho um código semelhante a este:

var records = db.Records.Where(r => r.IsProcessing == false).Take(100).ToList();
records.IsProcessing = true;
await db.SaveChangesAsync()
...further work with recods

Se este código é executado em várias instâncias de um microsevice, pode um problema de simultaneidade acontecer? (I. e. dois serviços irá obter o mesmo conjunto de registros). E se sim, como posso prevenir?

Quero evitar que meus serviços de ficar mesmos registros do banco de dados se eles chamam este método simultaneamente.

2

Melhor resposta

1

Você pode recuperar as linhas com um procedimento armazenado, a execução de uma transação serializável. Você pode desejar que outros atributos na tabela, algo como AssignedTo os registros que o serviço atribuído a essa linha, e de outro atributo, indicando que o processamento foi concluída. Caso contrário, se o serviço obtém algumas linhas, mas não antes de concluir todo o processamento, as linhas permanecem não processados. Quando um serviço recupera linhas, ele pode usar uma condição como AssignedTo = auto Ou AssignedTo É Nulo. Presumivelmente, há também um carimbo de data / hora ou outra maneira a priorizar as linhas selecionadas.

2021-11-23 23:26:52
1

Sim, ele vai, e ele pode não ser tão fácil de prevenir.

Imagine esses serviços são encarregadas de atualização de saldo de conta. Eles leiam o equilíbrio, e adicionar o valor do depósito sobre ele:

service 1: on a busy machine (slow)
service 2: on a not so busy machine (fast)
"john" has £100 on his account
service 1: read
service 2: read
service 1: balance = balance + 100;
service 2: balance = balance + 100;
service 2: set processing = true
service 2: set processing = true
service 2: update record
service 1: update record.
john ends up with £200 instead of £300.

Você precisará apresentar um escopo de transação, gerenciá-lo com o redis talvez, de modo que cada instância tem um ponto de verdade para verificar se está tudo ok para entrar e sair de atualização de escopo. Um "IsProcessing? ou SetIsProcessing" através da rede, se você vai.

2021-11-23 21:26:46

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................