3

У меня есть таблица на 9.1 сервер PostgreSQL, как это:Как предотвратить psycopg2 блокировки таблицы

CREATE TABLE foo(id integer PRIMARY KEY); 

В интерактивной оболочке Python с psycopg2 (≥ 2.4.2), я мог бы начать подключение и курсор и запросить эту таблицу:

import psycopg2 
conn = psycopg2.connect('dbname=...') 
curs = conn.cursor() 
curs.execute('SELECT * FROM foo;') 
curs.fetchall() 

Однако, если я затем попытаться изменить таблицу:

ALTER TABLE foo ADD COLUMN bar integer; 

это запускает виртуальный deadl ock, пока я не сделаю conn.close() от Python.

Как я могу начать простую связь с psycopg2, которая мешает ему создавать взаимоблокировки, вызванные изменениями DDL в другом месте? Соединение в Python может быть доступно только для чтения.

ответ

2

Решение, которое я нашел, чтобы использовать set_session так:

conn.set_session(readonly=True, autocommit=True) 

Документация autocommit предупреждает:

По умолчанию, любое выполнение запроса, включая простой SELECT, начнет транзакцию: для долгосрочных программ, если никаких дальнейших действий не предпринимается, сеанс останется «бездействующим в транзакции», что является нежелательным условием по нескольким причинам (блокировки хранятся в сеансе, таблицы bloat ...). Для долговечных сценариев либо гарантируйте как можно скорее прекратить транзакцию или использовать соединение autocommit.

Подводит итог опыту с простым SELECT в вопросе.

+1

Вы также можете просто использовать 'conn.commit()' вместо установки 'autocommit'' True' –