On Mon, Mar 19, 2012 at 02:04:34PM -0300, Sebastian Wain wrote:
> I am updating an item in a separated thread but when it finishes the new
> value is not updated in the same object in the main thread.
> 
>  
> 
> In the example below root['counter'] starts in 0, is incremented in the new
> thread but it remains in 0 in the main thread.
> 
>  
> 
> #!/usr/bin/python
> 
>  
> 
> from ZODB.FileStorage import FileStorage
> 
> from ZODB.DB import DB
> 
> from BTrees.OOBTree import OOBTree
> 
> import transaction
> 
> from threading import Thread
> 
> import persistent
> 
>  
> 
> class MyThread(Thread):
> 
>    def __init__(self, db):
> 
>       Thread.__init__(self)
> 
>       self.db = db
> 
>  
> 
>    def run(self):
> 
>       self.connection = self.db.open(transaction.TransactionManager())

This looks unnecessarily complicated.  Just use db.open(), transaction.begin(),
transaction.commit() -- these functions always use a thread-local transaction.

>       self.root = self.connection.root()
> 
>  
> 
>       print "Starting thread"
> 
>       self.connection.transaction_manager.begin()
> 
>       self.root["counter"] += 1
> 
>       self.connection.transaction_manager.commit()
> 
>       print "self.root['counter'] =", self.root['counter']
> 
>  
> 
>  
> 
> filename = 'test.fs'
> 
>  
> 
> storage = FileStorage(filename)
> 
> db = DB(storage)
> 
> connection = db.open()
> 
>  
> 
> root = connection.root()
> 
> if 'counter' not in root:
> 
>    transaction.begin()
> 
>    root['counter'] = 0
> 
>    transaction.commit()
> 
>  
> 
> thread = MyThread(db)
> 
> thread.start()
> 
>  
> 
> thread.join()
> 
>  
> 
> print "*** After ***"

As Alan said, you need a connection.sync() here.

I believe calling transaction.begin() again at this point would also do
that (just remember that transaction.begin() implicitly aborts the
previous transaction, so don't do that if you have uncommitted changes
you want to keep).

> print "root['counter'] =", root['counter']

Marius Gedminas
-- 
This is, or so I'm told, a classic book. I can see why. It is long and it
requires a great effort to finish it. If you go through a great effort to
suffer for a long time, you are allowed to sneer at people who can't be
bothered. That's the surest sign of classic art.
                -- Lars Wirzenius

Attachment: signature.asc
Description: Digital signature

_______________________________________________
For more information about ZODB, see http://zodb.org/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
https://mail.zope.org/mailman/listinfo/zodb-dev

Reply via email to