sqlalchemyでのロック
-
05-07-2019 - |
質問
複数の異なるプロセスからテーブルを同時に変更する方法について混乱しています。 Query.with_lockmode()
を使用しようとしましたが、2つのプロセスが同時に同じ行を照会するのを防ぐために、期待どおりの動作をしていないようです。私が試したことは次のとおりです。
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()
このスクリプトを同時に2回実行すると、 session.query(Test).filter(Test.id == 1).one()。x
が100ではなく50になります(そもそも0だったと仮定して)、それは私が望んでいたことでした。両方のプロセスに同時に値を更新させるか、2番目のプロセスを最初のプロセスが完了するまで待機させるにはどうすればよいですか?
解決
MyISAMテーブルを誤って使用していますか?これはInnoDBテーブルでは問題なく動作しますが、MyISAMで説明されている動作(分離を尊重するサイレント障害)が発生します。
所属していません StackOverflow