Можно ли определить, находится ли `Node` в транзакции в Neo4J с использованием Java API?

Можно ли определить, является ли Node находится в транзакции? Можно получить GraphDatabaseService по методу Node.getGraphDatabase,

Я хотел бы сделать что-то вроде этого:

public class Neo4JHelper {
    public void setProperty(Node node, String key, Object value) {
        if(isInTransaction(node) {
            node.setProperty(key, value);
        } else {
            throw new MyOwnException("You are trying to set a node outside a transaction... you suck");
        }
    }

    private boolean isInTransaction(Node node) {
        //Something
    }
}

Причина, по которой я хочу это сделать, заключается в том, что я хотел бы дать своим пользователям ошибку при попытке использования моего класса Neo4JHelperвне транзакции.

Другое решение было бы, если бы можно было как-то сообщить компилятору, что вам нужна транзакция для использования метода / класса, и в противном случае выдать ошибку компиляции.

2 ответа

Решение

Узел не может быть в транзакции, может быть только текущее выполнение (Thread).

Существует внутренний способ проверки работающей транзакции:

   ThreadToStatementContextBridge txManager = ((GraphDatabaseAPI) graphDB).getDependencyResolver().resolveDependency(ThreadToStatementContextBridge.class);
   txManager.hasTransaction();

У меня есть несколько разных вариантов, я не уверен, какой из них наиболее полезен.

Пункт № 1 заключается в том, что вам не нужно делать эту проверку. Если вы попытаетесь создать фиктивный узел, и вы не находитесь внутри транзакции, БД выдаст исключение, указывающее, что вы не участвуете в транзакции. Поэтому, если вы хотите обнаружить эту ситуацию, просто попробуйте создать тривиальный тестовый узел. Не исключение? Вы в транзакции.

Пункт № 2, возможно, вы спрашиваете, находится ли конкретный узел в транзакции. Я не знаю ни одного способа сделать это, возможно, разработчик может что-то добавить по этому поводу. Внутри транзакций можно получить блокировку чтения / записи на отдельном узле. Так что, если у вас было Transaction объект (что ваш метод не делает), то суррогатный метод может быть для определения, есть ли блокировка на данном узле.

Пункт № 3, хотя я не на 100% уверен в том, что вы делаете, ваш код подсказывает, что есть другой способ решения этой проблемы, поэтому вам даже не придется отвечать на этот вопрос. Если вы хотите, чтобы ваши пользователи получали пользовательскую ошибку, попробуйте изменить свойство - если neo4j выдает исключение, что вы не участвуете в транзакции, опять же, есть ваш ответ. Поймай это исключение, а затем выдавай свою ошибку.

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