Я предлагаю использовать psycopg2 вместо pgdb.pgdb использует следующую семантику:
connect () -> открыть соединение с базой данных, начать транзакцию
commit () -> commit, начать транзакцию
rollback () -> откат, начать транзакцию
execute () -> оператор execute
psycopg2, с другой стороны, использует следующую семантику:
connect () -> открытое соединение с базой данных
commit () -> commit
rollback () -> rollback
execute () -> начать транзакцию, если она уже не в транзакции, выполнить оператор
, поэтому, как упоминала Эмбер, вы можете выполнить откат или фиксацию после оператора select и завершить операциюсделка.К сожалению, с pgdb вы сразу же начнете новую транзакцию после отката или фиксации (даже если вы не выполняли никакой работы).
Для многих систем баз данных поведение pgdb хорошо, но из-за способаPostgreSQL обрабатывает транзакции, это может создать вам проблемы, если у вас много соединений, обращающихся к одним и тем же таблицам (проблемы, в частности, с вакуумом).
Почему pgdb запускает транзакцию сразу?Спецификация Python DB-API (2.0) требует для этого.Мне это кажется глупым, но так написана спецификация.