Вопрос

Я не совсем понимаю, как одновременно изменять таблицу из нескольких разных процессов. Я пытался использовать Query.with_lockmode () , но, похоже, он не выполняет то, что я от него ожидаю, что не позволит двум процессам одновременно запрашивать одни и те же строки. Вот что я пробовал:

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

Если я запускаю этот скрипт дважды одновременно, я получаю session.query (Test) .filter (Test.id == 1) .one (). x равным 50, а не 100 ( при условии, что это было 0 для начала), на что я и надеялся. Как заставить оба процесса одновременно обновлять значения или заставить второй ждать, пока первый не будет выполнен?

Это было полезно?

Решение

Вы случайно используете таблицы MyISAM? Это прекрасно работает с таблицами InnoDB, но будет иметь описанное поведение (тихое несоблюдение изоляции) с MyISAM.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top