2015-05-05 116 views
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調用會產生所有這些事件,但爲什麼?

回答

1

每次創建新的屬性鍵(或節點標籤)時,都會調用事務處理程序方法(在提交之前和之後)。這確實很奇怪,但顯然是通過設計。

有關更多信息,請參閱https://github.com/neo4j/neo4j/issues/1320

+0

好吧,這很奇怪。我的意思是,這些微交易在事件處理程序中彈出,但似乎它們的TransactionData是空的。嗯......我會將你的答案標記爲解決方案,謝謝! – tkroman

+0

它們確實是空的。這很奇怪,雖然沒有錯。乾杯! –

+0

我不能完全同意這一點,因爲我會執行一個由'setProperty'產生的結果是* not *觸發事件或觸發事件,該事件反映在'TransactionData'中屬性'櫃檯。 – tkroman