sqlalchemy의 잠금
-
05-07-2019 - |
문제
여러 프로세스에서 테이블을 동시에 수정하는 방법에 대해 혼란스러워합니다. 사용해 보았습니다 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과의 설명 된 행동 (격리를 존중하지 못하는 실패)을 가질 것입니다.
제휴하지 않습니다 StackOverflow