2015-12-14 2 views
2

Я хочу использовать управление транзакциями из Kundera (V3.2) для моей базы данных Cassandra. Ссылаясь на https://github.com/impetus-opensource/Kundera/wiki/Transaction-Management, эту функциональность можно использовать. Я написал следующий код:Сделки в kundera-cassandra

public void update(Account entity){ 
    EntityManager manager = this.entityManagerFactory.createEntityManager(getProperties()); 
    manager.setFlushMode(FlushModeType.COMMIT); 
    manager.getTransaction().begin(); 
    try{ 


     String queryStringNative = "UPDATE account SET value = 20 WHERE id = 'xxx' IF value = 10"; 
     Query query = manager.createNativeQuery(queryStringNative); 
     query.executeUpdate(); 

     String queryStringNative1 = "UPDATE account SET value = 30 WHERE id = 'yyy' IF value = 40"; 
     Query query1 = manager.createNativeQuery(queryStringNative1); 
     query1.executeUpdate(); 

     //commit 
     manager.getTransaction().commit(); 

    } catch(Exception e){ 
     manager.getTransaction().rollback(); 
    } 
    manager.clear(); 
    manager.close(); 
} 

Но когда я имитировать ошибку во втором запросе откат не работает, и учетная запись с идентификатором «хой» обновляется.

Итак, мой вопрос, можно ли вообще использовать реализацию транзакции от Kundera для kundera-cassandra?

EDIT:

я узнал, что Кундера использует EventLogQueue для выполнения отката или фиксации. Он читает события, которые находятся в очереди, и откатывает эти события. Проблема заключается в том, что EventQueue получает только события, которые отправляются вызовом метода EntityManager.persist(), EntityManager.remove() или EntityManager.merge(). Таким образом, при выполнении собственного запроса нет записи.

ответ

2

Сделки по родным запросам не поддерживаются Kundera.

Причина:

Кундера отслеживает состояние объекта объектов для обеспечения сделки. В собственных запросах запрос может быть любым: обновлять, удалять, создавать, метаданные, агрегировать запросы и т. Д., Где транзакции обычно не используются (по крайней мере, в мире NoSql).

Обход:

Вы можете иметь на стороне клиента сделки, явно проверяя на наличие ошибок и есть еще один запрос для отмены предыдущего запроса.

+0

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

+0

@ K.E. Да .. это потому, что мы поддерживаем формат JPA для запросов, и нет интерфейса для предоставления легких транзакций, специфичных для cassandra. Это два разных мира .. надеюсь, вы понимаете :) –

+0

Да, я понимаю, спасибо! –