Since I don't see a rollback(), commit(), or close() (or autocommit=True) up there, you are probably seeing transaction isolation in effect. Once you select rows in your Session, MySQL establishes those rows as part of the current transaction. You'll get the same value back for them every time until you start a new transaction.
http://dev.mysql.com/doc/refman/5.1/en/innodb-transaction-model.html
>
>
> Environment:
> two Django+SQLAlchemy Servers and one DatabaseServer
>
> Web Servers:
> - Python2.6
> - Django1.1.1
> - SQLAlchemy 0.6
> - Mysql-python 1.2.3
> with Nginx + Djanogo runfcgi mode (min 10 max100 prefork)
> on CentOS 5.4 running 2 phisical servers via ipvs loadbalancer
>
> Database Server:
> - MySQLCluster 7.1
> on CentOS5.4
>
> --
> You received this message because you are subscribed to the Google Groups "sqlalchemy" group.
> To post to this group, send email to sqlal...@googlegroups.com.
> To unsubscribe from this group, send email to sqlalchemy+...@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
>
the expire_all has the same effect, yes. You'd need to reproduce your behavior in an isolated test case to illustrate what you're doing. For example I see a "user.get()" up there, would need to know what that is, etc.