这是TransactionEventHandler的正常行为吗?

时间:2015-05-05 11:41:32

标签: java neo4j

Neo4j版本是2.2.1。

以下是代码:

Mobile Device    Count
  Yes             150
  No              670

以下是手册的摘录:

  

如果AtomicInteger afterCommitCallCounter = new AtomicInteger(0); AtomicInteger beforeCommitCallCounter = new AtomicInteger(0); db().registerTransactionEventHandler(new TransactionEventHandler.Adapter<Void>() { @Override public void afterCommit(TransactionData data, Void state) { afterCommitCallCounter.incrementAndGet(); } @Override public Void beforeCommit(TransactionData data) throws Exception { beforeCommitCallCounter.incrementAndGet(); return null; } }); Node n; try (final Transaction tx = db().beginTx()) { n = db().createNode(); tx.success(); } try (final Transaction tx = db().beginTx()) { for (int i = 0; i < 100; i++) { n.setProperty("" + i, i); } tx.success(); } System.out.println(afterCommitCallCounter); // 102 System.out.println(beforeCommitCallCounter); // 102 成功执行,则交易将成为   已提交,beforeCommit方法将被调用   事务数据以及从afterCommit返回的对象。

所以,我的问题:为什么beforeCommit被调用了102次?我认为提交只执行一次 - 在调用afterCommit期间。即它必须被称为2次tops,但在这种情况下,处理程序将在每次Transaction#close调用时得到通知。我没有在文档中找到明确的解释。

顺便说一句,如果你在第二个try-block中注释掉Node#setProperty,那么两个计数器的结果都是101,所以这些肯定是tx.success()次调用会生成所有这些事件,但是为什么呢?

1 个答案:

答案 0 :(得分:1)

每次创建新的属性键(或该事件的节点标签)时,都会调用事务事件处理程序方法(在提交之前和之后)。确实很奇怪,但显然是设计上的。

有关详细信息,请参阅https://github.com/neo4j/neo4j/issues/1320