Pergunta

Estou confuso sobre como modificar simultaneamente uma tabela a partir de vários processos diferentes. Eu tentei usar Query.with_lockmode(), mas não parecem estar fazendo o que eu espera que ele faça, o que seria para evitar dois processos de consulta, simultaneamente, as mesmas linhas. Aqui está o que eu tentei:

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()

Se eu executar esse script duas vezes simultaneamente, recebo session.query(Test).filter(Test.id==1).one().x igual a 50, em vez de 100 (assumindo que era 0 para começar), que era o que eu estava esperando. Como faço para que ambos os processos, quer atualizar simultaneamente os valores ou ter o segundo esperar até o primeiro é feito?

Foi útil?

Solução

Tem por acidente usando tabelas MyISAM? Esta multa trabalha com tabelas InnoDB, mas teria o comportamento descrito (falha silenciosa para respeitar o isolamento) com MyISAM.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top