Je suis confus sur la façon de modifier simultanément une table à partir de plusieurs processus différents. J'ai essayé d'utiliser Query.with_lockmode()
, mais il ne semble pas faire ce que je m'attends à faire, ce qui serait d'empêcher deux processus d'interroger simultanément les mêmes lignes. Voici ce que j'ai essayé:Verrouillage de sqlalchemy
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()
Si je cours deux fois simultanément ce script, je reçois session.query(Test).filter(Test.id==1).one().x
égale à 50, au lieu de 100 (en supposant qu'il était 0 pour commencer), ce qui était ce que j'espérais. Comment puis-je obtenir les deux processus pour mettre à jour simultanément les valeurs ou attendre que le second soit terminé?
Merci, c'est une erreur vraiment stupide. Je ne peux pas croire que j'ai passé autant de temps avec ça. – Noah