我想对我的Cassandra数据库使用Kundera(V3.2)中的事务管理。参考https://github.com/impetus-opensource/Kundera/wiki/Transaction-Management,应该可以使用此功能。我写了以下代码:

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();
}


但是,当我在第二个查询中模拟错误时,回滚将不起作用,并且ID为'xxx'的帐户将被更新。

所以我的问题是,通常可以以我的特殊方式将Kundera的事务实现用于kundera-cassandra吗?

编辑:

我发现Kundera使用EventLogQueue执行回滚或提交。它读取队列中的事件并回滚这些事件。问题在于,它似乎表明EventQueue仅接收由EntityManager.persist(),EntityManager.remove()或EntityManager.merge()的方法调用发送的事件。因此,在执行本机查询时没有条目。

最佳答案

本地查询不支持Kundera上的事务。

原因:

昆德拉(Kundera)跟踪实体对象的状态以确保交易。在本机查询中,查询可以是任何..更新,删除,创建,元数据查询,聚合查询等,其中通常不使用事务(至少在NoSql世界中)。

解决方法:

您可以通过显式检查错误来进行客户端事务,并可以通过另一个查询来撤消上一个查询。

关于java - 昆德拉- Cassandra 交易,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34263936/

10-09 05:07