Pregunta

Estoy confundido acerca de cómo modificar simultáneamente una tabla de varios procesos diferentes. He intentado usar Query.with_lockmode () , pero no parece que esté haciendo lo que espero que haga, lo que sería evitar que dos procesos consulten simultáneamente las mismas filas. Esto es lo que he intentado:

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 ejecuto esta secuencia de comandos dos veces simultáneamente, obtengo session.query (Test) .filter (Test.id == 1) .one (). x igual a 50, en lugar de 100 ( asumiendo que era 0 para empezar, que era lo que esperaba. ¿Cómo puedo hacer que ambos procesos actualicen simultáneamente los valores o que el segundo espere hasta que termine el primero?

¿Fue útil?

Solución

¿Estás usando las tablas MyISAM por accidente? Esto funciona bien con las tablas InnoDB, pero tendría el comportamiento descrito (falla silenciosa de respetar el aislamiento) con MyISAM.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top