On Jun 2, 2011, at 11:35 AM, Aalok Sood wrote: > Hello Michael > > Thanks a lot for your quick response. > I changed this loop to: > or i in range(1000): > ....: sleep(15) > ....: print "commiting" > ....: mm.name=u'old name' > ....: s.commit() > ....: sleep(25) > ....: mm.name=u'new name' > ....: print "commiting2" > ....: s.commit() > > That is to say, I always have something in s.dirty when i commit. This > makes session interact with DB for sure. This loop works fine w/o any > exceptions. > So what you say will definitely solve the issue. However my doubts are > more theoretical in nature. > > SQLAlchemy documentation says that if autocommit=False, on every > commit(), a new transaction is begun. So even if I do not have any > dirty changes and session need not send any data to the DB, still it > would have to contact the DB to begin a new transaction. > The behaviour as we saw, however, does not comply with this logic. > Can you please tell me where the loophole in my understanding of the > whole thing is. > > Once again, Thanks a lot for your help. I really appreciate it.
The confusion here is that the documentation for "commit", which I'm assuming you're reading is http://www.sqlalchemy.org/docs/orm/session.html#committing, refers to the term "transaction", which, while it's not deeply described at that point for the sake of clarity, is not the same thing as an actual transaction on an individual DBAPI connection connected to a database across a network. An in-depth description of what "transaction" means with regards to the session is later down the page at http://www.sqlalchemy.org/docs/orm/session.html#managing-transactions , pretty much the first paragraph. To restate, a "transaction" with regards to the Session is a boundary which will be terminated upon the next call to commit() or rollback(). The transaction itself is an in-memory structure which includes a collection of zero or more DBAPI connections. When the transaction is committed or rolled back, the commit() or rollback() method is ultimately called upon each DBAPI connection that is present. A DBAPI connection becomes present in the current "transaction" when it is first asked to participate in a statement execution. For those engines for which no statement execution has occurred within the scope of the Session's "transaction", no DBAPI connection is procured and no network communication occurs. Hope this clears it up ! > > Regards > Aalok Sood > > > > On Jun 2, 8:17 pm, Michael Bayer <[email protected]> wrote: >> The Session doesn't interact with the database until statements are first >> emitted, so while its being put into a new transaction each time with your >> block of code, probably nothing is being sent to the DB. If you stuck a >> line: s.execute("select 1") in there, that would likely wake it up. >> >> On Jun 2, 2011, at 9:32 AM, Aalok Sood wrote: >> >> >> >> >> >> >> >>> Hello Everyone >> >>> My mysql server wait_timeout is set to 35. >>> and if i run this code: >> >>> # Session s made with autocommit=False >>> mm=s.query(ss.Machine).get(1) >> >>> In [9]: >> >>> In [10]: for i in range(1000): >>> ....: sleep(15) >>> ....: print "commiting" >>> ....: s.commit() >>> ....: sleep(25) >>> ....: mm.name=u'new name' >>> ....: print "commiting2" >>> ....: s.commit() >> >>> Even though the second sleep is only for 25 seconds, I see an error >>> while commiting which says >>> 'Mysql server has gone away' >> >>> The SQLAlchemy documentation says that a new transaction is begun on a >>> commit(). If that is the case, I should not see the above error. >>> Maybe its an issue with commiting w/o any changes to the loaded >>> instances. >> >>> Can anyone throw some light on this. >>> Any help would be much appreciated. >> >>> -- >>> 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 >>> athttp://groups.google.com/group/sqlalchemy?hl=en. > > -- > 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. > -- 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.
