I am trying to understand what happens during race conditions on the Google AppEngine datastore. I have been using Objectify, so I’ll use that notation here.
@Cached
public class Car {
@Id
public Long id;
@Unindexed
public String owner = "C";
}
Now consider I have two runnables that try to modify the owner of a particular car simultaneously.
Car myCar = ofy.get(Car.class, 10);
myCar.owner = "A"; // Other runnable uses "B"
ofy.put(myCar);
System.out.println(ofy.get(Car.class, 10).owner);
I presume in this case its undetermined whether Car(10) will be “owned” by “A” or “B” but no errors will be reported. It would not be clear to the “loser” until the writes were persisted into the datastore. What would the result of the printlns be?
If I had used transactions, would one of the runnables (the “loser”) have raised an exception?
Both entities use the same ID (10) so one
put()will overwrite the other. It’s only the question which does it first.The second transaction to
put()would get the exception.Edit:
You might get different exceptions during transaction, not all of them mean that change was not (or will not be) commited. You should actually inspect the transaction and rollback if appropriate. See first example: http://code.google.com/appengine/docs/java/datastore/transactions.html