2
Neo4j版本是2.2.1。這是TransactionEventHandler的正常行爲嗎?
下面的代碼:
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
返回的對象。
所以,我的問題:爲什麼afterCommit
被稱爲102次?我認爲這個提交會執行一次 - 在致電Transaction#close
期間。即它必須被稱爲2次上限,但在這種情況下,處理程序正在通知每個Node#setProperty
呼叫。我沒有在文檔中找到明確的解釋。順便說一下,如果你在第二個try-block中註釋掉tx.success()
,那麼這兩個計數器的結果都是101,所以這些肯定是setProperty
調用會產生所有這些事件,但爲什麼?
好吧,這很奇怪。我的意思是,這些微交易在事件處理程序中彈出,但似乎它們的TransactionData是空的。嗯......我會將你的答案標記爲解決方案,謝謝! – tkroman
它們確實是空的。這很奇怪,雖然沒有錯。乾杯! –
我不能完全同意這一點,因爲我會執行一個由'setProperty'產生的結果是* not *觸發事件或觸發事件,該事件反映在'TransactionData'中屬性'櫃檯。 – tkroman