On Aug 12, 2010, at 7:36 AM, Erich Eder wrote:

> I've found a strange behaviour when using multiple sessions: A
> committed change to an object in one session does not get reflected in
> the other session, even after a session.expire_all() (or expire() or
> refresh() on the object. In fact, even an explicit query does not
> retrieve the changed data. I'm using MySQL. Further investigation
> showed that it happens only with InnoDB. Using MyISAM produces the
> expected results. Looks like a caching issue with InnoDB.

its not "caching", its transaction isolation, which is why expire_all() is not 
the issue here (and why expire_all() is not really needed by itself with 
autocommit=False - rollback() and commit() handle it).   at the end, session1 
is still open in its second transaction which has loaded a1.data as 123.

http://dev.mysql.com/doc/refman/5.0/en/innodb-consistent-read.html


> 
> Here is some test code:
> --------------------------------------------
> from sqlalchemy import create_engine, Table, Column, Integer
> from sqlalchemy.orm import sessionmaker
> from sqlalchemy.ext.declarative import declarative_base
> 
> Base=declarative_base()
> 
> class A(Base):
>    __tablename__="a"
>    __table_args__ = {'mysql_engine':'InnoDB'}
> 
>    id = Column(Integer, primary_key=True)
>    data = Column(Integer)
> 
> engine = create_engine('mysql://localhost/test')
> Base.metadata.bind = engine
> Base.metadata.drop_all()
> Base.metadata.create_all()
> 
> Session = sessionmaker(bind=engine)
> session1 = Session()
> session2 = Session()
> 
> a1 = A()
> a1.id = 1
> a1.data = 123
> 
> session1.add(a1)
> session1.commit()
> 
> print a1.data   # trigger query of a1.data
> 
> a2 = session2.query(A).one()
> 
> print a1,a2     # to see that a1 and a2 are different objects
> print a2.data
> 
> a2.data = 999
> session2.commit()
> 
> print "a1.data: ", a1.data
> print "session1.query(A.data): ", session1.query(A.data).one()[0]
> print "session2.query(A.data): ", session2.query(A.data).one()[0]
> 
> print "session1.expire_all()"
> session1.expire_all()
> 
> print "a1.data: ", a1.data
> print "session1.query(A.data): ", session1.query(A.data).one()[0]
> print "session2.query(A.data): ", session2.query(A.data).one()[0]
> ------------------------------------
> 
> The output is:
> 123
> a1.data:  123
> session1.query(A.data):  123
> session2.query(A.data):  999
> session1.expire_all()
> a1.data:  123
> session1.query(A.data):  123
> session2.query(A.data):  999
> 
> 
> When commenting out the __table_args__ line in order to use MyISAM,
> the output is what one would expect:
> 123
> a1.data:  123
> session1.query(A.data):  999
> session2.query(A.data):  999
> session1.expire_all()
> a1.data:  999
> session1.query(A.data):  999
> session2.query(A.data):  999
> 
> 
> Any idea?
> 
> Thanks,
> Erich
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to sqlalch...@googlegroups.com.
> To unsubscribe from this group, send email to 
> sqlalchemy+unsubscr...@googlegroups.com.
> 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 sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to