JDO 查询 returns 个不符合过滤条件的实体

JDO query returns entity that doesn't match the filter condition

我运行下面的jdo查询,它的目的是获取一个空的实体列表"flow id"。但是,当我检查返回的列表时,它确实包含一个具有非空流 ID 的实体。

PersistenceManager pm = pmf.getPersistenceManagerProxy();    
String flowId = "";
Map<String, Object> params = new HashMap<>();
params.put("flowId", flowId);
List<MyEntity> entities = pm.newQuery(MyEntity.class, " this.flowId == :flowId ").setNamedParameters(params).executeList();

它并不总是发生,但当它发生时,我发现总是有另一个进程对该实体进行更新以在类似的时间清除 "flow id"。但是,我从上述查询中获得的结果具有该实体,但显示了一个非空流 ID。我还检查了意外返回实体的 JDO 对象状态,它是持久干净的。查询在活动的 t运行 操作中 运行。

这里是SQL由JDOQLQuery编译的。

SELECT 'com.example.MyEntity' AS "NUCLEUS_TYPE","A0"."CREATE_TIME","A0"."DATA_MAX_TIMESTAMP","A0"."DATA_MIN_TIMESTAMP","A0"."ID","A0"."OBSERVATION_ID","A0"."PARTITION_VALUE","A0"."PARTITION_CYCLE","A0"."PARTITION_TIMESTAMP","A0"."FLOW_ID","A0"."PROCESSING_STAGE","A0"."PROCESSING_STATUS","A0"."RECORD_COUNT","A0"."UPDATE_TIME" FROM "MY_ENTITIES" "A0" WHERE "A0"."FLOW_ID" = ?

虽然我认为这不相关,但隔离级别是已提交读,实体是可分离的,上面的查询是 运行ning 在 t运行saction 中。请帮忙,谢谢!

更新

在我将隔离级别更改为可重复读取后,它再也没有发生过。很可能它与隔离级别有关。我不确定是否有错误。我的data nucleus版本是4.1.6。任何想法都会有所帮助。

我关闭了一级和二级缓存。似乎在 datanucleus 中缓存在某些极少数情况下不起作用,因为多个进程使用读取提交隔离级别更新同一行。

当数据存储应用过滤条件时,它可以看到来自另一个进程的最新更新(在我的示例中将 flow_id 设置为空)。所以它 returns 那一行。但是,当 datanucleus 使用行 ID 查找其字段时,它首先检查缓存,但该实体的缓存中可能存在陈旧值,这似乎是此问题的根本原因。