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()
次调用会生成所有这些事件,但是为什么呢?
答案 0 :(得分:1)
每次创建新的属性键(或该事件的节点标签)时,都会调用事务事件处理程序方法(在提交之前和之后)。确实很奇怪,但显然是设计上的。
有关详细信息,请参阅https://github.com/neo4j/neo4j/issues/1320。