Оптимистический контроль параллелизма в MongoDB с помощью .NET

Каков рекомендуемый подход для реализации оптимистичного управления параллелизмом при использовании .NET MongoDB API (MongoDB.Driver)? Например, есть ли что-нибудь аналогичное ROWVERSION / TIMESTAMP SQL Server, например, свойство, которое автоматически обновляется при изменении документа? Или есть спусковой механизм? Или любой другой механизм?


person Ricardo Peres    schedule 25.11.2015    source источник
comment
Поскольку я еще слишком новичок, чтобы комментировать. Создал эту проблему jira.mongodb.org/browse/CSHARP-2585   -  person Benjamin Lalonde    schedule 12.04.2019


Ответы (1)


В MongoDB нет ничего встроенного в отношении оптимистичного параллелизма. Вам нужно реализовать это самостоятельно, если вам это нужно.

Вы можете сделать это, добавив метку времени DateTime, прочитав ее перед выполнением обновления и используя эту метку времени в качестве фильтра для обновления. Если метка времени была изменена до того, как у вас была возможность обновить, операция обновления не сможет найти документ.

Например:

UpdateResult updateResult;
do
{
    var document = await collection.Find(_ => _.Id == id).SingleAsync(); // Get the current document
    updateResult = await collection.UpdateOneAsync(_ => _.Id == id && _.TimeStamp == document.TimeStamp, Builders<Item>.Update...); // Update the document only if the timestamp is the same
} while (updateResult.ModifiedCount == 0); // Try until an update was successfull
person i3arnon    schedule 25.11.2015
comment
Хороший пример :) хотя, как правило, вам следует избегать использования DateTimes для решения подобных технических проблем, потому что это ненадежно - 1 секунда в секунду сложнее, чем кажется, но и простые хитрые вещи, такие как переход на летнее время, могут вызвать мысль о том, что часы всегда увеличиваются и никогда не будут прежними. снова. Я рекомендую вам использовать старый добрый int в Revision поле вашего документа, а затем увеличивать его каждый раз, когда вы выполняете редактирование. - person mookid8000; 26.11.2015
comment
@ mookid8000 все даты в MongoDB указаны в формате UTC, но, тем не менее, это хороший момент. - person i3arnon; 26.11.2015
comment
Ах да, верно - тогда забудьте об экономии времени на дневное время;) но смещение часов взад и вперед на самом деле довольно распространено, и если ваши обновления будут частыми, вы в какой-то момент столкнетесь с этим - и в этом случае вы потеряете правки других программ обновления, и вы, вероятно, никогда не узнаете, почему это произошло. Тонко - и устрашающе! : -o - person mookid8000; 26.11.2015
comment
Этот ответ по-прежнему является рекомендуемым способом справиться с этим? Или есть улучшения в MongoDb, которые могут помочь? - person jimmy_terra; 12.09.2018
comment
Просто подсказка: если updateResult.IsAcknowledged имеет значение false, доступ к updateResult.ModifiedCount вызовет исключение. Поэтому перед использованием ModifiedCount убедитесь, что IsAcknowledged истинно. - person vts123; 16.07.2021