gpt4 book ai didi

java - 昆德拉- Cassandra 交易

转载 作者:行者123 更新时间:2023-11-30 08:43:29 25 4
gpt4 key购买 nike

我想为我的 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 跟踪实体对象的状态以确保交易。在 native 查询中,查询可以是任何不常使用事务的更新、删除、创建、元数据查询、聚合查询等(至少在 NoSql 世界中)。

解决方法:

您可以通过显式检查错误来进行客户端事务处理,并使用另一个查询来撤消之前的查询。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com