Domanda

Sono confuso su come modificare contemporaneamente una tabella da diversi processi. Ho provato a usare Query.with_lockmode () , ma non sembra fare quello che mi aspetto che faccia, che sarebbe impedire a due processi di interrogare simultaneamente le stesse righe. Ecco cosa ho provato:

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 eseguo questo script due volte contemporaneamente, ottengo session.query (Test) .filter (Test.id == 1) .one (). x uguale a 50, anziché a 100 ( supponendo che fosse 0 all'inizio), che era quello che speravo. Come posso ottenere che entrambi i processi aggiornino simultaneamente i valori o che il secondo aspetti fino al termine del primo?

È stato utile?

Soluzione

Usi per caso le tabelle MyISAM? Funziona bene con le tabelle InnoDB, ma avrebbe il comportamento descritto (fallimento silenzioso nel rispetto dell'isolamento) con MyISAM.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top