如何在TransactionEventHandler中设置节点的属性?

时间:2014-05-28 08:11:43

标签: java transactions neo4j

我在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?
  }
}

如何在没有此循环错误的情况下在事务事件处理程序中碰撞该节点版本?

0 个答案:

没有答案