1

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これを行う理由は、トランザクションの外部でクラスを使用しようとしたときに、ユーザーにカスタム エラーを与えたいからです。

別の解決策は、メソッド/クラスを使用するためにトランザクションが必要であることを何らかの形でコンパイラに伝え、そうでなければコンパイルエラーを発生させることができる場合です。

4

2 に答える 2

3

これにはいくつかの異なる見方がありますが、どれが最も役立つかはわかりません。

ポイント 1 は、このチェックを行う必要がないことです。ダミー ノードを作成しようとして、トランザクション内にいない場合、DB はトランザクション内にないことを示す例外をスローします。したがって、この状況を検出したい場合は、単純なテスト ノードを作成してみてください。例外なし?あなたは取引中です。

ポイント 2 は、特定のノードがトランザクション内にあるかどうかを尋ねている可能性があります。私はそれを行う方法を知りません。開発者がそれに何かを追加できるかもしれません。トランザクション内では、個々のノードで読み取り/書き込みロックを取得できます。したがって、Transactionオブジェクトがある場合 (メソッドにはありません)、代理メソッドは、特定のノードにロックがあるかどうかを判断することになる可能性があります。

ポイント#3 あなたが何をしているのか100%確信が持てませんが、コードはこの問題に別の方法があることを示唆しているため、この質問に答える必要さえありません。ユーザーにカスタム エラーを表示させたい場合は、先に進んでプロパティを変更してみてください。neo4j がトランザクションに参加していないという例外をスローした場合は、答えがあります。その例外をキャッチしてから、カスタム エラーをスローします。

于 2015-11-06T13:27:05.477 に答える
2

ノードはトランザクション内に存在できません。現在の実行 (スレッド) のみが存在できます。

実行中のトランザクションを確認する内部的な方法があります。

   ThreadToStatementContextBridge txManager = ((GraphDatabaseAPI) graphDB).getDependencyResolver().resolveDependency(ThreadToStatementContextBridge.class);
   txManager.hasTransaction();
于 2015-11-06T16:34:32.363 に答える