The low-level API will always retry datastore timeout exceptions -
that's the change that was made in 1.3.1 that made the Objectify retry
code superfluous.
There is one other situation in which the datastore will perform
retries - that's when you are performing a put() *outside of a
transaction* and you get a concurrency error. What's actually
happening is that put()s outside of a transaction are actually run in
a separate mini-transaction, and there is a small risk that you will
have an optimistic concurrency failure during that transaction
(basically, someone will sneak a write in). The datastore will retry
this exception automatically until the write occurs. This retrying
will *not* happen when you commit a declared transaction - you will
get the concurrent modification exception (I don't recall offhand
exactly what that exception is, but the google documentation on
transactions spells it out).
AFAIK there are no other cases in which the datastore will retry
failures for you. Any other exception (including concurrency failures
in declared transactions) goes up to your code, and you must retry it
yourself - if it makes sense.
In your example, catching and retrying is not going to help.
Jeff