我想对我的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/