2015-05-05 2 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. Я не нашел ясного объяснения в документах для этого.

Кстати, если вы закомментируете tx.success() во втором тестовом блоке, результат будет равен 101 для обоих счетчиков, так что это, безусловно, setProperty звонки, которые генерируют все эти события, но почему?

ответ

1

Каждый раз, когда вы создаете новый ключ свойства (или метку узла, если на то пошло), будут вызваны методы обработчика событий транзакции (как до, так и после фиксации). Это странно, но, по-видимому, по дизайну.

См. https://github.com/neo4j/neo4j/issues/1320 для получения дополнительной информации.

+0

Ну, это странно. Я имею в виду, что эти микротранзакции появляются в обработчиках событий, но похоже, что их TransactionData пуст. хм ... Я отвечу на ваш ответ как на решение, благодарю вас! – tkroman

+0

Они действительно пусты. Это странно, хотя и неверно. Ура! –

+0

Я не могу полностью согласиться с этим, так как я бы вывел микро-транзакцию, которая является результатом 'setProperty', чтобы либо приводить к * не * запускающим событиям, либо инициировать событие, которое отражается в' 'TransactionData' ' счетчик свойств. – tkroman

Смежные вопросы