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.

Reply via email to