2012-05-03 3 views
1

Я хочу реализовать оптимистичную блокировку на основе повторяющихся URI документов в моем приложении с использованием MarkLogic в качестве хранилища данных.Исключение для дубликатов документов с тем же URI в MarkLogic

Я прочитал документацию xdmp:document-insert() и обнаружил, что MarkLogic не генерирует исключение при вставке другой страницы с тем же URI, но вместо этого обновляет содержимое страницы, разрешение страницы и свойства с помощью новой страницы. Но есть ли способ, которым мы можем достичь этого в MarkLogic?

ответ

2

Проверьте подлинность документа перед вставкой. Я думаю, cts:uri-match - один из самых быстрых способов сделать это. Если он уже существует, вы можете сделать исключение из своего собственного, используя fn:error().

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

1

Вы хотите проверить существование док с помощью:

xdmp: существует (Fn: DOC ($ URI))

Это проверит наличие документа в URI без фактической загрузки документа. Затем вы можете определить, как вы хотите справиться с ситуацией.

3

Хорошие ответы, но я думаю, вам нужно создать резервную копию и спросить, каковы цели вашего приложения, а не предполагать, что вам нужно реализовать оптимистичную блокировку. 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 будет много споров, этот подход может обеспечить лучшую производительность.

Смежные вопросы