我必须实现一个Neo4j服务器插件,该插件可对数据库的更改做出反应并获取有关这些更改的信息。我需要获取在事务中已添加,更改和删除的所有数据。我使用TransactionEventHandler
注册到数据库。出于性能原因,我必须使用afterCommit
对数据库进行更改后调用的回调。这样,插件将不会阻止交易。
现在在此回调中,我做了一些类似的事情:
public void afterCommit(TransactionData data, Void arg1) {
for(Node n:data.createdNodes()) {
String firstkey = n.getPropertyKeys().iterator().next();
}
}
但是getPropertyKeys
抛出异常,因为事务已经被提交。我不明白为什么这是一个问题,我不想对事务进行任何更改,我只希望节点已更改的属性。有什么办法可以解决此问题?发生异常的原因是什么?
例外:
java.lang.IllegalStateException: This transaction has already been completed.
at org.neo4j.kernel.impl.api.KernelTransactionImplementation.assertTransactionOpen(KernelTransactionImplementation.java:376)
at org.neo4j.kernel.impl.api.KernelTransactionImplementation.acquireStatement(KernelTransactionImplementation.java:261)
at org.neo4j.kernel.impl.api.KernelTransactionImplementation.acquireStatement(KernelTransactionImplementation.java:80)
at org.neo4j.kernel.impl.core.ThreadToStatementContextBridge.instance(ThreadToStatementContextBridge.java:64)
at org.neo4j.kernel.InternalAbstractGraphDatabase$8.statement(InternalAbstractGraphDatabase.java:785)
at org.neo4j.kernel.impl.core.NodeProxy.getPropertyKeys(NodeProxy.java:358)
at de.example.neo4jVersionControl.ChangeEventListener.afterCommit(ChangeEventListener.java:41)
在afterCommit
事务中已经提交(因此名称)。要从节点访问属性,您需要一个事务上下文-请记住,每个操作(甚至是只读)都需要此操作。
推荐的实现TransactionEventHandler
s的方法是TransactionData
仅依赖。TransactionData.assignedNodeProperties()
还将返回新创建的节点的属性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句