Параллелизм ядра EF при использовании нескольких экземпляров

0

Вопрос

У меня есть код, похожий на этот:

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

Если этот код выполняется на нескольких экземплярах микросервиса, может ли возникнуть проблема параллелизма? (Т. е. две службы получат один и тот же набор записей). И если да, то как мне это предотвратить?

Я хочу, чтобы мои службы не получали одни и те же записи из БД, если они одновременно вызывают этот метод.

2

Лучший ответ

1

Вы можете получить строки с помощью хранимой процедуры, выполняемой в сериализуемой транзакции. Возможно, вам понадобятся другие атрибуты в таблице, что-то вроде Assigned, в котором записывается служба, назначенная этой строке, и другой атрибут, указывающий, что обработка завершена. В противном случае, если служба извлекает некоторые строки, но завершает работу с ошибкой до завершения всей обработки, эти строки остаются необработанными. Когда служба извлекает строки, она может использовать такое условие, как AssignedTo = self Или AssignedTo Равно Null. Предположительно, существует также временная метка или какой-либо другой способ приоритизации выбранных строк.

2021-11-23 23:26:52
1

Да, это произойдет, и, возможно, будет не так просто предотвратить это.

Представьте, что этим службам поручено обновлять остатки на счетах. Они считывают баланс и добавляют на него сумму депозита:

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.

Вам нужно будет ввести область транзакций, возможно, управлять ею с помощью redis , чтобы у каждого экземпляра была точка истины, чтобы проверить, можно ли входить и выходить из области обновления. A "Является ли обработка? или установите" Обработку " по сети, если хотите.

2021-11-23 21:26:46

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................