This inspired me to add a little snippet to Objectify's BestPractices document:

http://code.google.com/p/objectify-appengine/wiki/BestPractices#Use_Pythonic_Transactions

Basically, to run an automatically repeated transaction that updates a
(non-sharded to make the example simple) counter, I would do this:

DAOT.repeatInTransaction(new Transactable() {
        @Override
        public void run(DAOT daot)
        {
                Counter count = daot.ofy().find(Counter.class, COUNTER_ID);
                count.increment();
                daot.ofy().put(count);
        }
});

This will guarantee that updates to the counter are not lost.

Jeff

On Thu, Apr 7, 2011 at 10:08 AM, Jeff Schnitzer <j...@infohazard.org> wrote:
> This video will help you immensely:
>
> http://sites.google.com/site/io/under-the-covers-of-the-google-app-engine-datastore
>
> You can skip to the end if you just want to grok the transactions, but
> the rest of it is extraordinarily helpful as well.
>
> You are correct, if you use transactions, you do not need to manage a
> timestamp.  This is because GAE has its own timestamp on each entity
> group.  When you load an entity in a transaction, GAE checks this
> timestamp.  When you commit, it checks the timestamp again - and if
> something changed, you get a ConcurrentModificationException.  By
> running your transaction in a retry loop and checking for
> ConcurrentModificationException, you can safely ensure that non-stale
> data is written.
>
> Note that this isn't too far off from a description of what happens
> when you do a non-transactional put().  It's just that the transaction
> and retry loop are performed within the datastore itself.  Creating an
> explicit transaction just provides the opportunity for your business
> logic to get "in the loop" so to speak.
>
> Jeff
>
> On Thu, Apr 7, 2011 at 7:09 AM, Peter Backx <peter.ba...@gmail.com> wrote:
>> Hi Ikai,
>>
>> Could you expand your answer a little? Do you mean that I don't need to
>> manage a timestap/version if I use transactions? Or do you mean I should use
>> transactions to combine a read (to check for a changed timestamp/version)
>> with a write?
>>
>> If I don't manage the timestamp myself, how does AppEngine know another
>> process change the data since the last read? part of the key?
>>
>> Sorry for those beginner questions, I started using the datastore via the
>> JDO API with a relational background, but it looks it isn't always the best
>> fit for typical datastore issues. Objectify looks much better as it is
>> specifically designed for it.
>>
>>
>> Thanks every one for your answers
>>
>> Peter
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Google App Engine for Java" group.
>> To post to this group, send email to google-appengine-java@googlegroups.com.
>> To unsubscribe from this group, send email to
>> google-appengine-java+unsubscr...@googlegroups.com.
>> For more options, visit this group at
>> http://groups.google.com/group/google-appengine-java?hl=en.
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to google-appengine-java@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to