Заблокируйте таблицу или строки, чтобы проверить условие и вставить строку

#postgresql #flask #sqlalchemy #flask-sqlalchemy

Вопрос:

Мне нужно выполнить последовательные шаги:

  1. чтобы заблокировать таблицу или определенные строки (с условием) для записи;
  2. чтобы проверить некоторые строки с определенными условиями;
  3. если строк с условиями нет, добавьте новую строку
  4. разблокировка

Как я могу это сделать в SQLAlchemy, Flask, PostgreSQL? Какие способы являются правильными?

Комментарии:

1. Сделайте все это в транзакции. Это включает в себя доступ кода к базе данных. Затем установите желаемый уровень изоляции транзакций .

Ответ №1:

Если вы хотите, чтобы это было безопасно от условий гонки, вам нужно использовать транзакцию с SERIALIZABLE уровнем изоляции. Выполните всю операцию в этой транзакции.

Ответ №2:

Я использую Flask-Sqlalchemy, так что попробуйте внести коррективы.

Вы можете использовать with_for_update() здесь. Документы

Примером может быть.

 class TestTable(db.Model):
    __tablename__ = "test_table"
    id = Column(db.Integer(), primary_key=True)
    filename = Column(db.String(1024))
    is_complete = Column(db.Boolean(), default=False, server_default="f")
 

Вы можете заблокировать их, выполнив:

 for table in TestTable.query.with_for_update().filter_by(is_complete=False).all():
    # Example Check condition
    if table.filename != 'bar' and table.id >= 10:
       # Add a new row
       newtable = TestTable(filename='foo')
       db.session.add(newtable)

# Save and release lock
db.session.commit()