I think you can handle this with a datastore transaction.  See
http://code.google.com/appengine/articles/transaction_isolation.html for
more details.

The increment_counter example at
http://code.google.com/appengine/docs/python/datastore/transactions.htmlshould
be adaptable to your example.

-Chris


On Wed, Jul 14, 2010 at 10:17 AM, Sam <couponsys...@gmail.com> wrote:

> In working with the data store, I've been able to solve all of my
> "issues" (coming from a RDBMS background, had to rethink a few
> things!), save for one.  In the application I'm working on, it's
> necessary to "reserve" a record at a moment in time and then display
> that record to the end user, ensuring that each user gets a single
> record and no duplicates are issued.  Working with the record prior,
> and using SQL as an engine, I was able to use the following query:
>
> UPDATE CCode SET SessionID = '" + strSessionID + "', Assigned = 1
> WHERE Assigned = 0 AND PartnerID = " + str(intPartnerID) + " AND
> ExpireDate >= '" + str(dtCompareDate) + "' Limit 1"
>
> This would update the record in one pass and effectively reserve the
> record for the established session, with no time lost inbetween
> issuing the update and recording the change while SQL handled any
> conflict resolution should two people request a record at the same
> time.
>
> However, dealing with datastore, I seem to be running into some
> problems with timing and wanted to know if anyone had any creative
> ways around it.
>
> I realize that I can run a standard GqlQuery to return the results I
> need and then update based on the returned result and add the session
> to the record without a problem.  What concerns me is the timing
> factor.  During the time it takes for the query to execute and the
> resulting put() statement, it would be possible for another user to
> arrive and make the same basic query recalling the same record set.  I
> know I could check for updates against the datastore before writing
> back (used to do this years ago...), but this could potentially cause
> a deadlock condition when the load on the system became greater and
> multiple simultaneous users needed access to the records for selection
> and updating.
>
> Any thoughts on how to work around this?
>
> --
> You received this message because you are subscribed to the Google Groups
> "Google App Engine" group.
> To post to this group, send email to google-appeng...@googlegroups.com.
> To unsubscribe from this group, send email to
> google-appengine+unsubscr...@googlegroups.com<google-appengine%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-appengine?hl=en.
>
>

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

Reply via email to