2009-09-11 6 views
3

여러 프로세스에서 동시에 테이블을 수정하는 방법에 대해 혼란스러워합니다. 나는 Query.with_lockmode()을 사용해 보았지만, 두 프로세스가 동시에 같은 행을 쿼리하는 것을 막을 수있을 것이라고 기대하지는 않는 것 같습니다. 여기에 내가 무엇을 시도했다입니다 :sqlalchemy에서 잠그기

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() 

내가 두 번 동시에이 스크립트를 실행하면, 나는 (그것을 시작하는 0이었다 가정) (50)와 동일한 session.query(Test).filter(Test.id==1).one().x보다는 100을 내가 바라던 된 얻을. 두 프로세스 모두 값을 동시에 업데이트하거나 첫 번째 프로세스가 완료 될 때까지 두 번째 프로세스를 기다리는 방법은 무엇입니까?

답변

4

실수로 MyISAM 테이블을 사용하고 계십니까? 이것은 InnoDB 테이블에서 잘 작동하지만, MyISAM으로 기술 된 행동 (고립을 존중하는 침묵 한 실패)을 가질 것이다.

+0

감사합니다. 정말 바보 같은 실수입니다. 내가 그걸로 많은 시간을 보냈다는 것을 믿을 수 없다. – Noah