java - 为什么我得到 Only ancestor queries are allowed inside transactions 错误

标签 java google-app-engine transactions google-cloud-datastore objectify

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 替换查询。

你能做的最接近的是:

  1. 通过无祖先查询获取实体,无需事务。记住实体的键。
  2. 开始交易。
  3. 通过键获取实体。
  4. 检查查询条件是否仍然适用(= 属性仍然具有与查询条件相同的值)。这样您就可以确定实体在您进行查询后没有发生变化。
  5. 更改并保存实体。提交交易。

关于java - 为什么我得到 Only ancestor queries are allowed inside transactions 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14397207/

相关文章:

java - 值对象 getter

Java 微服务无法与 AWS Athena 客户端通信 : Handshake_Failure

java - @Transactional 不打开 Hibernate 事务

python - 如何覆盖时间戳字段以进行单元测试?

java - 我可以将 Guice 中的 @Transactional 与 Google App Engine 的数据存储一起使用吗?

c# - 有没有办法将 TransactionScope 与现有连接一起使用?

java - 使用 Selenium webdriver Java 定位具有不清楚 Id 类的元素

java - + 和 Stringbuilder 追加性能

python - Google Cloud - 使用 python 连接到同一项目中的 postgresql 数据库

google-app-engine - 查找方法以获取数据库中返回空数据集的记录