Frage

Ich bin verwirrt darüber, wie gleichzeitig eine Tabelle aus mehreren verschiedenen Prozessen zu ändern. Ich habe versucht, Query.with_lockmode() verwenden, aber es scheint nicht zu tun, was ich erwarten, zu tun, die von gleichzeitig zwei Prozesse zu verhindern wäre, die gleichen Zeilen abfragt. Hier ist, was ich habe versucht:

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

Wenn ich das Skript zweimal gleichzeitig laufen, bekomme ich session.query(Test).filter(Test.id==1).one().x gleich 50 statt 100 (vorausgesetzt, es 0 war zu beginnen), das war, was ich habe gehofft. Wie erhalte ich beiden Prozesse entweder gleichzeitig die Werte zu aktualisieren oder die zweiten warten, bis die ersten fertig ist?

War es hilfreich?

Lösung

Sind Sie zufällig mit MyISAM-Tabellen? Dies funktioniert mit InnoDB-Tabellen in Ordnung, aber würde das beschriebene Verhalten (silent Fehlerisolierung zu respektieren) hat mit MyISAM.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top