Каков рекомендуемый подход для реализации оптимистичного управления параллелизмом при использовании .NET MongoDB API (MongoDB.Driver)? Например, есть ли что-нибудь аналогичное ROWVERSION / TIMESTAMP SQL Server, например, свойство, которое автоматически обновляется при изменении документа? Или есть спусковой механизм? Или любой другой механизм?
Оптимистический контроль параллелизма в MongoDB с помощью .NET
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
Хороший пример :) хотя, как правило, вам следует избегать использования
DateTime
s для решения подобных технических проблем, потому что это ненадежно - 1 секунда в секунду сложнее, чем кажется, но и простые хитрые вещи, такие как переход на летнее время, могут вызвать мысль о том, что часы всегда увеличиваются и никогда не будут прежними. снова. Я рекомендую вам использовать старый добрый int
в Revision
поле вашего документа, а затем увеличивать его каждый раз, когда вы выполняете редактирование.
- person mookid8000; 26.11.2015
@ mookid8000 все даты в MongoDB указаны в формате UTC, но, тем не менее, это хороший момент.
- person i3arnon; 26.11.2015
Ах да, верно - тогда забудьте об экономии времени на дневное время;) но смещение часов взад и вперед на самом деле довольно распространено, и если ваши обновления будут частыми, вы в какой-то момент столкнетесь с этим - и в этом случае вы потеряете правки других программ обновления, и вы, вероятно, никогда не узнаете, почему это произошло. Тонко - и устрашающе! : -o
- person mookid8000; 26.11.2015
Этот ответ по-прежнему является рекомендуемым способом справиться с этим? Или есть улучшения в MongoDb, которые могут помочь?
- person jimmy_terra; 12.09.2018
Просто подсказка: если updateResult.IsAcknowledged имеет значение false, доступ к updateResult.ModifiedCount вызовет исключение. Поэтому перед использованием ModifiedCount убедитесь, что IsAcknowledged истинно.
- person vts123; 16.07.2021