代码之家  ›  专栏  ›  技术社区  ›  Noah

锁定sqlalchemy

  •  4
  • Noah  · 技术社区  · 17 年前

    我对如何同时修改来自多个不同进程的表感到困惑。我试过用 Query.with_lockmode()

    import time
    from sqlalchemy.orm import sessionmaker, scoped_session
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import *
    
    engine = create_engine('mysql://...?charset=utf8&use_unicode=0', pool_recycle=3600, echo=False)
    Base = declarative_base(bind=engine)
    session = scoped_session(sessionmaker(engine))
    
    class Test(Base):
        __tablename__ = "TESTXYZ"
        id = Column(Integer, primary_key=True)
        x = Column(Integer)
    
    def keepUpdating():
        test = session.query(Test).filter(Test.id==1).with_lockmode("update").one()
    
        for counter in range(5):
            test.x += 10
            print test.x
            time.sleep(2)
    
        session.commit()
    
    
    keepUpdating()
    

    session.query(Test).filter(Test.id==1).one().x 等于50,而不是100(假设一开始是0),这正是我所希望的。如何让两个进程同时更新值,或者让第二个进程等待第一个进程完成?

    1 回复  |  直到 13 年前
        1
  •  4
  •   Ants Aasma    17 年前

    您是否偶然使用MyISAM表?这在InnoDB表中运行良好,但在MyISAM中会有所描述的行为(无声地违反隔离)。