Вложенные транзакции в Neo4j
Для записи я использую Neo4j 2.0.0-M02.
В настоящее время у меня есть метод, который может искать узлы с меткой "Пользователь" на их ID пользователя, который хранится в графе как свойство узла "ID". Все это происходит в транзакции, поскольку это автоматически закрывает ResourceIterator.
Теперь я хочу создать отношения между двумя пользователями. Все, что у меня есть, это их идентификатор пользователя. Теперь я, очевидно, хотел бы повторно использовать метод, который ищет пользователей по их идентификатору. И есть три способа, о которых я могу думать.
Первый - очевидный. Получить два узла с уже существующим методом. Затем вызвать метод, который создает отношения между ними. Очевидно, что это происходит и в транзакции, поэтому для этого потребуется три транзакции. Не так эффективно.
Второй - просто повторно использовать код (а не метод) в новом методе, который создает отношения. Таким образом, я могу сделать все это за одну транзакцию, но я дублирую код, который не очень хорошая практика для разработчиков.
Третий - дважды вызвать существующий метод внутри транзакции нового метода, который создает отношение. Таким образом, мой код можно использовать повторно, но я не уверен, как работают вложенные транзакции в Neo4J. Будут ли игнорироваться транзакции из существующего метода, потому что уже существует транзакция? Это решило бы мою проблему.
Если нет, я должен переосмыслить, где я управляю своими транзакциями. Я знаю, что обычно лучше управлять ими в сервисах, чем в DAO, но я бы хотел, чтобы вещи Neo4j не входили в мои классы обслуживания.
1 ответ
Третий вариант - как это будет работать, поскольку в neo4j нет действительно вложенных транзакций, а вместо этого очень мелкие транзакции, в которых существует внешняя транзакция, поэтому практически нет накладных расходов.
Транзакция tx = db.beginTx(); пытаться { другой метод (дБ); tx.success(); } в конце концов { tx.finish(); } private void otherMethod( GraphDatabaseService db) { Транзакция tx = db.beginTx(); пытаться { // делать другие вещи... tx.success(); } в конце концов { tx.finish(); } }
В приведенном выше примере вызов otherMethod() будет работать с существующей транзакцией или без нее. Если транзакция существует, то выполняемые в ней операции будут выполняться в ней, но при отсутствии существующей транзакции она будет создана. Так что оба будут работать.