boolean r = ofy().transact(new Work<Boolean>() {
@Override
public Boolean run() {
Visit visit = ofy().load().type(Visit.class)
.filter(Visit.USER_ID, userID)
.filter(Visit.VENUE_ID, venueID).first().get();
if (visit == null)
return false;
visit.setLastRequestDate(new Date(timestamp));
ofy().save().entity(visit).now();
return true;
}
});
我明白了
java.lang.IllegalArgumentException: Only ancestor queries are allowed inside transactions.
用于 get()
调用的行。
为什么?我在此事务中仅查询 Visit
实体。
我在事务中这样做,因为我希望所有这些都作为原子操作执行。
最佳答案
无法在事务中进行无祖先查询。您可以在没有事务的情况下执行此操作,也可以使用 get 替换查询。
你能做的最接近的是:
- 通过无祖先查询获取实体,无需事务。记住实体的键。
- 开始交易。
- 通过键获取实体。
- 检查查询条件是否仍然适用(= 属性仍然具有与查询条件相同的值)。这样您就可以确定实体在您进行查询后没有发生变化。
- 更改并保存实体。提交交易。
关于java - 为什么我得到 Only ancestor queries are allowed inside transactions 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14397207/