One important change here is to change the engine type to InnoDB, otherwise transactions are entirely meaningless with MySQL.
If I use InnoDB, the end result of "used" is 0 in all cases. If I don't and use MyISAM, the end result of "used" is 1 in all cases, regardless of whether InviteCode is loaded before, or after, the begin(). It seems likely that the issue is simply that you forgot to use InnoDB. On Jan 10, 2011, at 1:43 AM, Romy wrote: > Sorry Michael, 'self-contained' wasn't a proper term for that test > given that it required an initial DB state containing a single row. > I've modified your version to try and reproduce the bug. > > Since yours didn't use elixir at all and I'm not familiar with > elixir's internals, I was able to reproduce only what I believe to be > the equivalent in sqlalchemy. Please note you'll need to create a > mysql database and fill in the connection string, as the test does not > fail with sqlite! > > from sqlalchemy import * > from sqlalchemy.orm import * > from sqlalchemy.ext.declarative import declarative_base > > e = create_engine('mysql://user:p...@localhost/test', echo=True) > > Base = declarative_base() > > class InviteCode(Base): > __tablename__ = 'test_invite_codes' > id = Column(Integer, primary_key=True) > used = Column(Integer, default=0) > users = relationship("User", backref="invite_code") > > class User(Base): > __tablename__ = 'test_users' > id = Column(Integer, primary_key=True) > invite_code_id = Column(Integer, > ForeignKey('test_invite_codes.id')) > email = Column(String(128), unique=True) > > Base.metadata.create_all(e) > session = Session(e, autocommit=True) > > session.query(User).delete() > session.query(InviteCode).delete() > > invite_code = InviteCode() > session.add(invite_code) > session.flush() > > assert invite_code.used == 0 > > session.close() > > session.begin() > user_row = User(email="n...@unique.com", invite_code_id=None) > session.add(user_row) > session.commit() > > invite_code = session.query(InviteCode).first() > assert invite_code.used == 0 > > session.begin() > invite_code.used = invite_code.used + 1 > session.add(invite_code) > session.flush() > user_row_2 = User(email="n...@unique.com", invite_code_id=None) > session.add(user_row_2) > > rolled_back = False > > try: > session.commit() > except: > rolled_back = True > session.rollback() > > assert rolled_back > assert invite_code.used == 0 > > -- > 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.