昆德拉-卡桑德拉交易

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 世界中)。

解决方法:

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