昆德拉-卡桑德拉交易
Transactions in kundera-cassandra
我想为我的 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 世界中)。
解决方法:
您可以通过显式检查错误来进行客户端事务,并进行另一个查询以撤消之前的查询。
我想为我的 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 世界中)。
解决方法:
您可以通过显式检查错误来进行客户端事务,并进行另一个查询以撤消之前的查询。