【发布时间】:2018-11-01 06:37:40
【问题描述】:
我运行了以下 jdo 查询,它旨在获取具有空“流 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();
它并不总是发生,但是当它发生时,我发现总是有来自另一个进程的对该实体的更新,以在类似的时间清除“流 id”。但是,我从上述查询中获得的结果具有该实体,但显示了一个非空的流 ID。我还检查了意外返回实体的 JDO 对象状态,它是持久干净的。查询在活动事务中运行。
这里是 JDOQLQuery 编译的 SQL。
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" = ?
虽然我认为这无关紧要,但隔离级别是读提交的,实体是可分离的,并且上面的查询是在事务中运行的。请帮忙,谢谢!
更新
在我将隔离级别更改为可重复读取后,它就再也不会发生了。因此很可能与隔离级别有关。我不确定是否存在错误。我的数据核版本是 4.1.6。任何想法都会有所帮助。
【问题讨论】:
-
发布类,实际调用了什么SQL?
-
添加了 sql。 @比利弗罗斯特
-
并且只要传递的参数(您可以记录)是您所期望的,那么您就不会返回一些无效的对象。
-
您可以做的另一件事是围绕它定义一个事务,这样您就可以看到 txn 何时启动,从而相对于其他任何正在更新的进程打开连接。
-
这就是我问这个问题的原因,我记录了参数,它是一个空字符串。获得结果列表后,我立即检查是否存在任何具有非空 flow_id 的实体并且我得到了一个。这就是这个问题的全部内容,我正在寻找线索。查询已在活动事务中运行。 @比利弗罗斯特
标签: java jdo datanucleus