[ZODB-Dev] newbie ZEO first try. ConflictError.
tsmiller
tsmiller at gnixterhouse.com
Thu Nov 26 16:55:51 EST 2009
Christian,
Thanks. How painfully obvious. I have written the words
'transaction.begin()' about a thousand times or so! But I get
discombobulated when I start looking at something new ( ZEO ) and forget the
obvious. Final code for this little test that works perfectly:
while True:
transaction.begin()
root[ "one" ] = "program 2 - " + time.asctime()
while True:
try:
transaction.commit()
except POSException.ConflictError:
time.sleep(.2)
else:
break
time.sleep(5)
tom
Christian Theune-2 wrote:
>
> Hi,
>
> On 11/26/2009 10:08 PM, James Bergstra wrote:
>> On Thu, Nov 26, 2009 at 1:51 PM, tsmiller<tsmiller at gnixterhouse.com>
>> wrote:
>>>
>>> Laurence,
>>> Thank you for your very quick reply. I did as you suggested and now the
>>> ConflictError is now handled. And that is a most excellent thing
>>> because
>>> now ConflictError is raised every time. So it still seems to be
>>> confused.
>>> I am trying to figure out if I will be able to use ZEO in my
>>> application.
>>>
>>> Now my program reads:
>>>
>>> while True:
>>> root[ "one" ] = time.asctime()
>>> while True:
>>> try:
>>> print "Try to commit transaction"
>>> transaction.commit()
>>> print "root is", root
>>> except POSException.ConflictError:
>>> print "we have a conflict"
>>> transaction.abort()
>>> time.sleep(.2)
>>> else:
>>> break
>>>
>>> time.sleep(10)
>>>
>>
>> I have a related question about this code... in the inner loop tom is
>> calling abort() ; sleep(); commit(). Does that make sense?
>>
>> I thought that abort() would revert the root to the database's version
>> of things, and discard any change that the client had tried to make.
>> So what does it mean to call commit() again immediately and why that
>> commit cause a conflict when the client hasn't actually changed
>> anything since abort() ?
>
> The abort() actually also marks the point when the next transaction
> begins implicitly.
>
> Your code would work perfectly if whenever you start a transaction, you
> simply call transaction.begin():
>
> while True:
> transaction.begin()
> root[....
>
> This will cause the time.sleep(2) to not be included in the transaction
> and your conflict rate will quickly go down for your example. If you
> also use a random factor for the sleep (e.g. between 0.2 and 0.3) then
> you'll have a lesser chance of subsequent conflicts in your example
> because all your transactions are very similar. In real life
> transactions would be distinct enough to cause different offsets in
> runtime.
>
> Hope this helps,
> Christian
>
> --
> Christian Theune · ct at gocept.com
> gocept gmbh & co. kg · forsterstraße 29 · 06112 halle (saale) · germany
> http://gocept.com · tel +49 345 1229889 0 · fax +49 345 1229889 1
> Zope and Plone consulting and development
>
> _______________________________________________
> For more information about ZODB, see the ZODB Wiki:
> http://www.zope.org/Wikis/ZODB/
>
> ZODB-Dev mailing list - ZODB-Dev at zope.org
> https://mail.zope.org/mailman/listinfo/zodb-dev
>
>
--
View this message in context: http://old.nabble.com/newbie-ZEO-first-try.--ConflictError.-tp26532984p26535390.html
Sent from the Zope - ZODB-Dev mailing list archive at Nabble.com.
More information about the ZODB-Dev
mailing list