RCB RCB - 4 days ago 4
Java Question

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

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.

Answer

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.
Comments