По некоторым неясным причинам мы используем реплицированную базу данных orient-db для нашего приложения.
Вероятно, у нас будут случаи, когда одну и ту же запись можно будет создать дважды. Вот как это происходит:
- у нас есть объекты
user_document
, у них есть идентификатор пользователя и идентификатор документа - и пользователи, и документы управляются в другом приложении и хранятся в другой базе данных; - это другое приложение при создании нового документа отправляет широковещательное событие (через тему rabbit-mq);
- несколько экземпляров нашего приложения получают это сообщение и создают еще один
user_document
с той же паройuser_id
иdocument_id
.
Если я правильно понимаю, мы должны использовать индекс UNIQUE
для пары этих идентификаторов и полагаться на распределенные транзакции.
Однако по некоторым причинам (у нас есть еще одна команда, создающая слой между приложением и базой данных), мы, вероятно, не могли использовать UNIQUE
, хотя это может показаться глупым :)
Каковы тогда наши шансы?
Можем ли мы, например, разрешить всем экземплярам создавать избыточные записи и сразу после создания выбирать по user_id
и document_id
, а если их больше одного, удалять экземпляры с лексикографически более высоким собственным id
?