also, when you say you "triggered" the problem, can you do that  
predictably ?  can you send a small test program that does it every  
time ?  otherwise it sounds like a threading thing (if thats at all  
possible).

On Oct 21, 2006, at 6:18 AM, François Wautier wrote:

>
> Hi Michael,
>
> Nope! Nothing of that sort. I couldn't care less about transaction  
> at this
> point.
>
> All I do is
>
>       
>         self.dbEng=sqlalchemy.create_engine 
> (myurl,strategy='threadlocal')
>         #debug
>         self.dbEng.echo=True
>         try:
>             self.dbConn=self.dbEng.connect()
>             self.dbSession=sqlalchemy.create_session(bind_to=  
> self.dbConn)
>         except sqlalchemy.exceptions.DBAPIError,msg:
>             QMessageBox.critical(None,"Race Management","Problem  
> with the
>                               database: "+str(msg))
>             sys.exit(-1)
>
> After that all I do is create "dbPeople", set the needed properties  
> and issue
> a "flush" on the one session I have.
>
> I did trigger the problem I described at least twice And once more  
> just now).
> The behaviour was exactly the same in all cases.
>
> I installed SQLAlchemy using the standard Gentoo command (emerge),  
> a md5sum on
> the file used in the install gives
>       
> fd9898c75d2773d075db89c6a99d31d6  /usr/portage/distfiles/ 
> SQLAlchemy-0.2.8.tar.gz
>
> Regards,
>       François
>
>
>
>
>> hey François -
>>
>> are you using the SessionTransaction explicitly ?  or  
>> connection.begin
>> () ?   Ive tried many combinations, and the only way I can reproduce
>> the problem is by doing something incorrect:
>>
>>          c = engine.connect()
>>          s = create_session(bind_to=c)
>>
>>          tran = c.begin()
>>          session_tran = s.create_transaction()
>>
>>          s.save(User())
>>          s.flush()
>>          u = User()
>>          s.save(u)
>>          s.user_name = 'some user'
>>
>>          tran.commit()
>>          session_tran.commit()
>>
>> the reason the above is incorrect is because the "Transaction" and
>> "SessionTransaction" are not nested properly.
>>
>> The fix you have wouldnt be correct since the SessionTransaction is
>> being closed (if not the underlying connection, which was the
>> original bug), so it should remove its association from its host
>> Session.
>>
>> On Oct 20, 2006, at 6:59 AM, François Wautier wrote:
>>> Hi Michael,
>>>
>>> It seems I spoke too quickly.
>>>
>>> The problem is now when I try to flush a  second time with a new
>>> object.
>>> Something like this
>>>
>>>     newguy=dbPeople()
>>>     session.save(newguy)
>>>     newguy.Lastname="Doe"
>>>     newguy.Firstname="John"
>>>     newguy.gender="Ambiguous"
>>>     session.flush()
>>>     newguy=dbPeople()
>>>     session.save(newguy)
>>>     newguy.Lastname="Doe"
>>>     newguy.Firstname="Jane"
>>>     newguy.gender="Sheila"
>>>     session.flush()
>>>
>>> The last session flush results in a new record being written to the
>>> database,
>>> but an exception is raised, with the error message
>>>
>>>     This transaction is inactive
>>>
>>> If one were to try to add more dbPeople, the records won't be saved
>>> into the
>>> database for the session keeps on using the same key value (the
>>> table uses
>>> an "auto_increment")
>>>
>>>
>>> I hacked the code a bit and I solved the problem.... but I am far
>>> from sure
>>> that I did the right thing for all cases
>>>
>>> In  lib/sqlalchemy/orm/session.py  around line 67 I changed
>>>
>>>      for t in self.connections.values():
>>>                 if (t[2]):
>>>                     t[0].close()
>>>     self.session.transaction = None
>>>
>>> into
>>>          keeptransaction=False
>>>      for t in self.connections.values():
>>>                 if (t[2]):
>>>                     t[0].close()
>>>                 else:
>>>                     keeptransaction=True
>>>     if not keeptransaction=False:
>>>             self.session.transaction = None
>>>
>>> I wonder if something like this would not be preferable (but I
>>> again, I have
>>> no clue as to what the consequences of my code is)
>>>
>>>     closeall=False
>>>     for t in self.connections.values():
>>>                 if (t[2]):
>>>                     closeall=True
>>>     if closeall:
>>>         for t in self.connections.values():
>>>                 t[0].close()
>>>         self.session.transaction = None
>>>
>>>
>>> Regards,
>>>     François
>>
>>
>
> >


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/sqlalchemy
-~----------~----~----~----~------~----~------~--~---

Reply via email to