2

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

4

1 回答 1

2

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

原因:

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

解决方法:

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

于 2015-12-14T12:11:03.157 回答