Я запутался в том, как одновременно изменять таблицу из нескольких разных процессов. Я попытался использовать 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 для начала), на что я и надеялся. Как заставить оба процесса либо одновременно обновлять значения, либо заставить второй ждать, пока первый не будет сделан?