Как обрабатывать многопоточные обновления MongoDb from.net занятия?


MongoDb, драйвер c#: два потока берут один и тот же документ из MongoDb, меняют его состояние и обновляют его обратно в базу данных. Я хочу, чтобы каждый поток определял, были ли какие-либо изменения сделаны другим потоком между моментами чтения и обновления этого документа. Если такие изменения выполняются другим потоком, я не хочу, чтобы текущий поток переопределял их, и я хочу записать эту информацию в журнал. Пожалуйста, дайте мне знать возможные решения для этого. Я знаю, что есть методы MongoCollection<T>.Update и MongoCollection<T>.FindAndModify, где я могу определите запрос на основе информации, взятой из БД, но я не вижу никаких способов определить, был ли документ действительно найден и обновлен или нет, нет никакой информации, такой как количество обновленных записей, возвращенных.

1 2

1 ответ:

Насколько я понимаю, вы хотите оптимистическую блокировку.

Простой способ реализовать оптимистическую блокировку-это версировать ваши документы и увеличивать номер версии с каждым обновлением, т. е.

public void Update(MyClass document)
{
    db.GetCollection<MyClass>("MyClass").Update(
        Query.And(
            Query<MyClass>.EQ(p => p.Id, document.Id), 
            Query<MyClass>(p => p.Version, document.Version),
            Update<MyClass>.Replace(document).Inc(p => p.Version));
}
Теперь предположим, что два потока A и B выполняют операции одновременно:
  • читаемый документ id 8, version = 5
  • B чтение документа id 8, version = 5
  • B идентификатор обновления магазина 8, версия = 6
  • попытка сохранить обновление на документ id 8, версия 5, но такого объекта больше не существует.

MongoCollection<T>.Update возвращает значение WriteConcernResult, имеющее свойство DocumentsAffected, которое можно использовать для проверки того, был ли документ обновлен или нет.

Также смотрите MongoDB docs: изолировать последовательность операций