Очистить блокировку общего доступа на postgres отношениях после запроса select - PullRequest
0 голосов
/ 27 апреля 2020

Я понимаю, что когда мы запускаем запрос select для таблицы postgres, он получает AccessShareLock. Он создается только для тех таблиц, где я выполнял select запросов, но не для других. Я использую sqlalchemy для взаимодействия с postgres, и все, что мне нужно, это то, можем ли мы очистить AccessShareLock после выполнения оператора select (ниже приведен пример, скопированный из здесь

from sqlalchemy.orm import sessionmaker
from models import OneTable, get_engine

engine = get_engine(database="mydb")
session = sessionmaker(bind=engine)()

results = session.query(OneTable.company_name).all()

# need to remove "AccessShareLock" lock on OneTable
# without explicitly calling session.close() or engine.dispose()

session.close()

Все, что мне нужно, это снять блокировку после запроса таблицы. Я запускаю некоторые сервисы-демоны, которые запрашивают базу данных через регулярные промежутки времени (скажем, раз в час), но мои операторы DDL в этой таблице не выполняются, поскольку для этого требуется AccessExclusiveLock. Любые предложения о том, как это сделать или как я должен делать, чтобы решить эту проблему

1 Ответ

0 голосов
/ 27 апреля 2020

Единственный способ снять блокировку таблицы - завершить транзакцию, которая взяла блокировку, либо с помощью COMMIT или ROLLBACK. Блокировки всегда удерживаются до конца транзакции.

Таким образом, способ получить то, что вам нужно, это убедиться, что все ваши транзакции короткие. Помимо решения вашей проблемы, это также гарантирует, что автоочистка может эффективно удалять старые версии строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...