У меня есть таблица, jobs
, с полями id
, rank
и datetime started
в базе данных MySQL InnoDB.проблема обновления параллелизма sqlalchemy
Каждый раз, когда процесс получает задание, он «проверяет», что это задание должно быть отмечено, так что никакой другой процесс не будет работать на нем.
Я хочу, чтобы один процесс с сеансом, чтобы иметь возможность:
- Найти работу с наибольшим рейтингом
- Update эта работа началась поле с текущей временной меткой
без риска что любая другая сессия также может выбирать и начинать работу с наивысшим рейтингом. Другие сеансы также меняют рейтинг в любой момент времени.
Это моя попытка:
session.execute("LOCK TABLES jobs READ")
next_job = session.query(Jobs).\
filter(Jobs.started == None).\
order_by(Jobs.rank.desc()).first()
# mark as started
smt = update(Jobs).where(Jobs.id == next_job.id).\
values(started=datetime.now())
session.execute(smt)
session.execute("UNLOCK TABLES")
, но это не удается с:
OperationalError: (OperationalError) (1099, "Table 'jobs' was locked with a READ lock and can't be updated")
Я бы предпочел, чтобы сделать это в более вещий образом, SQLAlchemy предлагает в любом случае. Как я могу это сделать?
EDIT: Чтобы уточнить, я говорю о читать параллелизм/записи в базе данных, не поточно/синхронизации процесса. Мои работники будут распространяться по сети.
метод '.with_update_for()' на самом деле то, что вам нужно использовать. – lollercoaster
'.with_update_for'? Можете ли вы предоставить ссылку на документацию? – Eric
Вы имеете в виду ['with_for_update'] (http://docs.sqlalchemy.org/en/rel_0_9/orm/query.html#sqlalchemy.orm.query.Query.with_for_update) – Eric