Хорошие ответы, но я думаю, вам нужно создать резервную копию и спросить, каковы цели вашего приложения, а не предполагать, что вам нужно реализовать оптимистичную блокировку. MarkLogic Server делает оптимистичную блокировку внутри, и поэтому, возможно, вам не нужно беспокоиться об этом. Прочтите http://docs.marklogic.com/5.0doc/docapp.xqy#display.xqy?fname=http%3a//pubs/5.0doc/xml/dev_guide/transactions.xml для получения дополнительной информации о MarkLogic и транзакциях.
Если вам необходимо проверить наличие документа в обновлении, используйте fn:doc
- не cts:uri-match
или xdmp:exists
. Эти функции отлично подходят для запросов только для чтения, поскольку они не загружают документы в память. Это нормально для запросов только для чтения. Но если вам нужно проверить наличие документа в обновлении, тогда вам нужно сделать блокировку чтения для обеспечения согласованности. В противном случае у вас будет код, который, как представляется, работает, но имеет потенциал для условий гонки. Чтобы обеспечить блокировку чтения, используйте fn:exists(fn:doc($uri))
или вызовите fn:doc($uri)
в эффективном булевом контексте.
http://docs.marklogic.com/5.0doc/docapp.xqy#display.xqy?fname=http://pubs/5.0doc/apidoc/UpdateBuiltins.xml&category=UpdateBuiltins&function=xdmp:lock-for-update также может представлять интерес. Функция xdmp:lock-for-update
обходит поведение по умолчанию, оптимизирует поведение и явно блокирует URI. Если вы сделаете это как можно раньше в своем обновлении, у вас будет пессимистическая блокировка. В ситуациях, когда вы знаете, что в URI будет много споров, этот подход может обеспечить лучшую производительность.