Вложенные транзакции в 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() будет работать с существующей транзакцией или без нее. Если транзакция существует, то выполняемые в ней операции будут выполняться в ней, но при отсутствии существующей транзакции она будет создана. Так что оба будут работать.

Другие вопросы по тегам