题
我对如何从多个不同进程同时修改表感到困惑。我已经尝试使用 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),这是我所希望的。如何让两个进程同时更新值或让第二个进程等到第一个完成?
解决方案
您是否偶然使用MyISAM表?这适用于InnoDB表,但是会使用MyISAM进行描述的行为(无法保证尊重隔离)。
不隶属于 StackOverflow