Question

Je ne comprends pas comment modifier simultanément une table à partir de plusieurs processus différents. J'ai essayé d'utiliser Query.with_lockmode () , mais il ne semble pas fonctionner comme prévu, ce qui empêcherait deux processus d'interroger simultanément les mêmes lignes. Voici ce que j'ai essayé:

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 j'exécute ce script deux fois simultanément, j'obtiens session.query (Test) .filter (Test.id == 1) .one (). x égal à 50 plutôt qu'à 100 ( en supposant que c'était 0 pour commencer), ce qui était ce que j'espérais. Comment faire en sorte que les deux processus mettent à jour simultanément les valeurs ou que le second attende que le premier soit terminé?

Était-ce utile?

La solution

Utilisez-vous accidentellement les tables MyISAM? Cela fonctionne bien avec les tables InnoDB, mais aurait le comportement décrit (échec silencieux du respect de l’isolation) avec MyISAM.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top