Chiusura in sqlalchemy
-
05-07-2019 - |
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?
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.