문제

여러 프로세스에서 테이블을 동시에 수정하는 방법에 대해 혼란스러워합니다. 사용해 보았습니다 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 100이 아닌 50과 같다 (처음에는 0이라고 가정). 두 프로세스가 동시에 값을 동시에 업데이트하거나 두 번째 프로세스가 첫 번째 프로세스가 완료 될 때까지 기다리게하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

우연히 Myisam 테이블을 사용합니까? 이것은 InnoDB 테이블과 잘 작동하지만 MyISAM과의 설명 된 행동 (격리를 존중하지 못하는 실패)을 가질 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top