Как обрабатывать многопоточные обновления MongoDb from.net занятия?
MongoDb, драйвер c#: два потока берут один и тот же документ из MongoDb, меняют его состояние и обновляют его обратно в базу данных. Я хочу, чтобы каждый поток определял, были ли какие-либо изменения сделаны другим потоком между моментами чтения и обновления этого документа. Если такие изменения выполняются другим потоком, я не хочу, чтобы текущий поток переопределял их, и я хочу записать эту информацию в журнал. Пожалуйста, дайте мне знать возможные решения для этого. Я знаю, что есть методы MongoCollection<T>.Update
и MongoCollection<T>.FindAndModify
, где я могу определите запрос на основе информации, взятой из БД, но я не вижу никаких способов определить, был ли документ действительно найден и обновлен или нет, нет никакой информации, такой как количество обновленных записей, возвращенных.
1 ответ:
Насколько я понимаю, вы хотите оптимистическую блокировку.
Простой способ реализовать оптимистическую блокировку-это версировать ваши документы и увеличивать номер версии с каждым обновлением, т. е.
Теперь предположим, что два потока A и B выполняют операции одновременно: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)); }
- читаемый документ id 8, version = 5
- B чтение документа id 8, version = 5
- B идентификатор обновления магазина 8, версия = 6
- попытка сохранить обновление на документ id 8, версия 5, но такого объекта больше не существует.
MongoCollection<T>.Update
возвращает значениеWriteConcernResult
, имеющее свойствоDocumentsAffected
, которое можно использовать для проверки того, был ли документ обновлен или нет.Также смотрите MongoDB docs: изолировать последовательность операций