2016-05-19 7 views
1

Я пытаюсь явно заблокировать таблицу Postgres, используя эту команду SQLAlchemy:SQLAlchemy явная блокировка Postgresql таблицы

db.engine.execute('BEGIN; LOCK TABLE database_version IN ACCESS EXCLUSIVE MODE;') 

После этого выполняется, если я иду в клиенте базы данных и выполните команду:

select * from pg_catalog.pg_locks; 

Нет никаких замков ACCESS EXCLUSIVE.

Если вместо этого я запускаю первую команду, но изнутри клиента db работает, как ожидалось.

Есть ли причина, по которой попытка блокировки таблицы из sqlalchemy работает некорректно?

В идеале, я хочу, чтобы только один процесс мог запрашивать и вставлять в таблицу database_version за раз.

+0

Когда вы говорите «после этого исполняется», вы как-то поддерживаете соединение? Выходит ли скрипт, выполняющий эту инструкцию? – univerio

+0

Я положил time.sleep (20) туда после этой строки, чтобы дать мне время перейти к клиенту и запустить запрос. – Andrew

ответ

1

Получается, что мне нужно было начать вложенную транзакцию из объекта сеанса вместо того, чтобы пытаться использовать BEGIN, используя прямой SQL.

db.session.begin_nested() 
db.session.execute('LOCK TABLE database_version IN ACCESS EXCLUSIVE MODE;') 

Затем я вставить новую строку:

new_version = DatabaseVersion(version=version + 1) 
db.session.add(new_version) 
db.session.commit() 

, а затем, наконец, совершить еще раз, чтобы закрыть вложенную транзакцию:

db.session.commit() 
0

Я считаю, что для блокировки сеанса можно использовать запрос session.query (database_version) .with_lockmode ('update')

Я все еще пытаюсь подтвердить.

Смежные вопросы