Параллельное создание в OrientDB

По некоторым неясным причинам мы используем реплицированную базу данных orient-db для нашего приложения.

Вероятно, у нас будут случаи, когда одну и ту же запись можно будет создать дважды. Вот как это происходит:

  • у нас есть объекты user_document, у них есть идентификатор пользователя и идентификатор документа - и пользователи, и документы управляются в другом приложении и хранятся в другой базе данных;
  • это другое приложение при создании нового документа отправляет широковещательное событие (через тему rabbit-mq);
  • несколько экземпляров нашего приложения получают это сообщение и создают еще один user_document с той же парой user_id и document_id.

Если я правильно понимаю, мы должны использовать индекс UNIQUE для пары этих идентификаторов и полагаться на распределенные транзакции.

Однако по некоторым причинам (у нас есть еще одна команда, создающая слой между приложением и базой данных), мы, вероятно, не могли использовать UNIQUE, хотя это может показаться глупым :)

Каковы тогда наши шансы?

Можем ли мы, например, разрешить всем экземплярам создавать избыточные записи и сразу после создания выбирать по user_id и document_id, а если их больше одного, удалять экземпляры с лексикографически более высоким собственным id?


person Rodion Gorkovenko    schedule 30.06.2014    source источник
comment
Какой релиз вы используете? Пожалуйста, обновитесь до 1.7.4.   -  person Lvca    schedule 01.07.2014


Ответы (1)


Конечно, вы можете сделать таким образом. Вы можете попробовать использовать что-то вроде

DELETE FROM (SELECT FROM user_document where user_id=? and document_id=? skip 1)

Однако обратите внимание, что без создания индекса этот подход может потреблять некоторые дополнительные ресурсы на сервере, и вы можете получить значительное замедление, если user_document имеет большое количество записей.

person enisher    schedule 02.07.2014