Terry Kerr wrote:
I have a method which increments an attribute on the current object. I have created a thread lock so that multiple threads accessing the method simultaneously cannot stuff up the attribute value:
The ZODB doesn't work like that ;-) As I understand it, each DB connection gets it's own consistent copy of the ODB, so you don't need to worry about locking...
def nextOrderNumber(self): lock.acquire() self._order_number = self._order_number + 1 lock.release() return str(self._order_number)
My concern is that even though a second thread is halted at "lock.acqure()" while the first thread updates the order_number, that the second thread has an 'out of date' version of 'self' with the original order_number value in it, hence, is still returning the incorrect order_number.
Indeed. The is called conflict resolution and your problem is solved as an example in: http://www.zope.org/Documentation/Articles/ZODB2 ...in the section "Resolving Conflicts" Personally, I'd use a file-based counter or auto incrementing sequel column. cheers, Chris