Hello,
I am new to SQL Alchemy and this is a terrific tool for my project. I
am facing problems when I run a multi threaded application. The
situation is as below :
I have a table in the DB to generate a unique key everytime I request
for it. DB.py is the file which interfaces with the database. The code
to get object ID is below :
def getObjId(self):
#ObjId is not Persistent
DB.SessionLock.acquire()
g = ''
print "Currently Servicing : %s" %
threading.currentThread().getName()
if len(self.session.query(GlobalObjectID).all()) == 0:
print "First Time"
g =
GlobalObjectID(GlobalObjectID.START_VAL)
#If persistent in DB, Increment, Update and return.
else :
print "Querying DB"
g = self.session.query(GlobalObjectID).one()
print "Got : %d" % g.getCurObjId()
g.setCurObjId(g.getCurObjId() + GlobalObjectID.INCR_VAL)
print g
#Update DB. Make the Object persistent in DB
try:
print repr(self.session.identity_map.values())
self.session.save_or_update(g)
print repr(self.session.identity_map.values())
self.session.commit()
print repr(self.session.identity_map.values())
except:
printException("Error Saving ObjectID Counter to
DB!",False)
self.session.rollback()
os.system("pause")
DB.SessionLock.release()
return -1111
DB.SessionLock.release()
return g.getCurObjId()
(DB is the class where this method is defined).
GlobalObjectID is a class linked with globalobjectid table in the
database. From my test code, I create multiple threads, each of which
gets the same DB object (say dbo) and they print dbo.getObjecdtId 10
times.
After a while, I start getting exceptions during session.commit :
KeyError: (<class 'Model.GlobalObjectID'>, (1078,), None).
I dont understand why, because the critical operation of fetching an
object ID from dB, Incrementing it and Saving it back is under a lock.
Also, I dont understand what does it mean, when I see objects in
session.identity_map.values() and dont see anything in session.new or
session.dirty or session.deleted. What other state could the object
be?
The session above is a transactional session with autoflush set to
True. Is there anything wrong with the code above? please let me know.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---