Why do I get Only ancestor queries are allowed inside transactions error

穿精又带淫゛_ 提交于 2019-12-07 06:10:41

问题


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;
        }
    });

and I get

java.lang.IllegalArgumentException: Only ancestor queries are allowed inside transactions.

for the line with the get() call.
why? I'm only querying Visit entity in this transaction. I'm doing this in a transaction, because I want all this to be performed as atom operation.


回答1:


No way to do ancestor-less query inside a transaction. Either you do it without transactions or replace query with get.

The closest that you can do is:

  1. Get entity with ancestor-less query without transaction. Remember key of the entity.
  2. Start transaction.
  3. Get entity via the key.
  4. Check that query condition still applies (= properties still have the same values as in query conditions). This way you can be sure entity was not changed since you did the query.
  5. Change & save entity. Commit transaction.



回答2:


The error seems quite clear: inside a transaction, you're only allowed to perform ancestor queries. Your query is not an ancestor query.



来源:https://stackoverflow.com/questions/14397207/why-do-i-get-only-ancestor-queries-are-allowed-inside-transactions-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!