2015-12-14 2 views
2

Je souhaite utiliser la gestion des transactions de Kundera (V3.2) pour ma base de données Cassandra. En se référant à https://github.com/impetus-opensource/Kundera/wiki/Transaction-Management, il devrait être possible d'utiliser cette fonctionnalité. J'écrit le code suivant:Transactions dans 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(); 
} 

Mais quand je simule une erreur dans la deuxième requête la restauration ne fonctionne pas et le compte avec l'id « xxx » est mis à jour.

Donc, ma question, est-il généralement possible d'utiliser l'implémentation de transaction de Kundera pour kundera-cassandra de ma façon particulière?

EDIT:

J'ai découvert que Kundera utilise un EventLogQueue pour effectuer une annulation ou validation. Il lit les événements qui se trouvent dans la file d'attente et annule ces événements. Le problème est, il semble que l'EventQueue ne reçoive que les événements qui sont envoyés par l'appel de méthode de EntityManager.persist(), EntityManager.remove() ou EntityManager.merge(). Il n'y a donc aucune entrée lors de l'exécution d'une requête native.

Répondre

2

Les transactions sur les requêtes natives ne sont pas prises en charge par Kundera.

Raison:

Kundera suit l'état de l'entité des objets pour assurer des transactions. Dans les requêtes natives, la requête peut être quelque chose .. mettre à jour, supprimer, créer, requêtes de métadonnées, requêtes d'agrégation, etc où les transactions ne sont généralement pas utilisées (au moins dans le monde NoSql).

Solution:

Vous pouvez avoir des transactions côté client en vérifiant explicitement des erreurs et une autre requête pour annuler la requête précédente.

+0

Merci pour votre réponse. Je comprends la raison. La mauvaise chose est, une combinaison de la gestion des transactions de Kundera et les transactions légères de Cassandra serait une fonctionnalité intéressante. Mais cela ne peut pas être utilisé car Kundera ne supporte pas les transactions légères sur leur méthode persist. –

+0

@ K.E. Oui .. c'est parce que nous supportons le format JPA pour l'interrogation et qu'il n'y a pas d'interface pour exposer les transactions légères spécifiques à Cassandra. Ce sont deux mondes différents .. J'espère que vous comprenez :) –

+0

Oui, je comprends, merci! –