Версия 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
. Я не нашел ясного объяснения в документах для этого.
Кстати, если вы закомментируете tx.success()
во втором тестовом блоке, результат будет равен 101 для обоих счетчиков, так что это, безусловно, setProperty
звонки, которые генерируют все эти события, но почему?
Ну, это странно. Я имею в виду, что эти микротранзакции появляются в обработчиках событий, но похоже, что их TransactionData пуст. хм ... Я отвечу на ваш ответ как на решение, благодарю вас! – tkroman
Они действительно пусты. Это странно, хотя и неверно. Ура! –
Я не могу полностью согласиться с этим, так как я бы вывел микро-транзакцию, которая является результатом 'setProperty', чтобы либо приводить к * не * запускающим событиям, либо инициировать событие, которое отражается в' 'TransactionData' ' счетчик свойств. – tkroman