2009-09-11 6 views
3

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é?

Répondre

4

Avez-vous accidentellement utilisé des tables MyISAM? Cela fonctionne bien avec les tables InnoDB, mais aurait le comportement décrit (échec silencieux de respecter l'isolement) avec MyISAM.

+0

Merci, c'est une erreur vraiment stupide. Je ne peux pas croire que j'ai passé autant de temps avec ça. – Noah