我想为我的 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() 的方法调用发送的事件。所以执行本机查询时没有条目。