我在Neo4j中定义自己的TransactionEventHandler
时遇到问题。我的目标(此处为simlicity)是每次进行任何事务时都会在db中修改版本节点的version属性。
在下面的代码中,我首先创建一个应该保存当前版本的版本节点,然后注册我的事务事件处理程序,然后在db中创建一个节点来触发beforeCommit()
的执行。
然后挂起,过了一会儿,我得到this stack trace。
我正在使用neo4j-2.1.0-M02
和
这是我的代码:
public class MyTransactionEventHandlerTest {
private static GraphDatabaseService db;
private static MyTransactionEventHandler transactionEventHandler;
@BeforeClass
public static void setup() {
db = new TestGraphDatabaseFactory().newImpermanentDatabase();
Node versionNode = null;
try (Transaction tx = db.beginTx()) {
versionNode = db.createNode(DynamicLabel.label("__TransactionVersion__"));
tx.success();
}
transactionEventHandler = new MyTransactionEventHandler(versionNode);
db.registerTransactionEventHandler(transactionEventHandler);
}
@AfterClass
public static void shutdown() {
db.shutdown();
}
@Test
public void commitSomething() {
try (Transaction transaction = db.beginTx()) {
db.createNode(DynamicLabel.label("Something")); // trigger beforeCommit()
transaction.success();
}
}
}
我的事务处理程序类:
public class MyTransactionEventHandler implements TransactionEventHandler<Object> {
private Node versionNode;
public MyTransactionEventHandler(Node versionNode) {
this.versionNode = versionNode;
}
@Override
public Object beforeCommit(TransactionData data) throws Exception {
incrementTransactionVersion();
return null;
}
@Override
public void afterCommit(TransactionData data, Object state) {
}
@Override
public void afterRollback(TransactionData data, Object state) {
}
public Node getVersionNode() {
return versionNode;
}
private void incrementTransactionVersion() {
versionNode.setProperty("transactionVersion", (Long) versionNode.getProperty("transasactionVersion", 0L) + 1);
// this gets called many times, but doesn't return?
}
}
如何在没有此循环错误的情况下在事务事件处理程序中碰撞该节点版本?