Postgresql как запустить что то вне транзакции
ROLLBACK — прервать текущую транзакцию
Синтаксис
Описание
ROLLBACK откатывает текущую транзакцию и приводит к аннулированию всех изменений, произведённых транзакцией.
Параметры
Необязательные ключевые слова, не оказывают никакого влияния. AND CHAIN
Если добавляется указание AND CHAIN , сразу после окончания текущей транзакции начинается новая с такими же характеристиками транзакции (см. SET TRANSACTION ). В противном случае новая транзакция не начинается.
Замечания
Чтобы завершить и зафиксировать транзакцию, используйте COMMIT .
При выполнении команды ROLLBACK вне блока транзакции выдаётся предупреждение и больше ничего не происходит. Однако ROLLBACK AND CHAIN вне блока транзакции вызывает ошибку.
Примеры
Чтобы прервать все операции:
Совместимость
Команда ROLLBACK соответствует стандарту SQL, а форма ROLLBACK TRANSACTION является расширением PostgreSQL.
PostgreSQL — как запустить VACUUM из кода вне блока транзакций?
Я использую Python с psycopg2, и я пытаюсь запустить полный VACUUM после ежедневной операции, которая вставляет несколько тысяч строк. Проблема в том, что когда я пытаюсь запустить команду VACUUM в моем коде, я получаю следующую ошибку:
Как я могу запустить это из кода вне транзакционного блока?
Если это имеет значение, у меня есть простой класс абстракции DB, подмножество которого показано ниже для контекста (не выполняются, исключение и обработка docstrings опущены и корректировки строк):
6 ответов
После большего поиска я обнаружил свойство isol_level объекта соединения psycopg2. Оказывается, изменение этого параметра на 0 выведет вас из блока транзакций. Изменение вакуумного метода вышеуказанного класса к следующему разрешает его. Обратите внимание, что я также установил уровень изоляции на то, что ранее было на самом деле (по умолчанию это 1 ).
В этой статье (в конце на этой странице) приводится краткое объяснение уровней изоляции в этом контексте.
В то время как вакуумные версии подвержены сомнению в текущих версиях postgresql, вызывая «анализ вакуума» или «переиндексацию» после того, как некоторые массивные действия могут повысить производительность или очистить использование диска. Это postgresql конкретный, и его необходимо очистить, чтобы делать правильные вещи для других баз данных.
К сожалению, прокси-сервер, предоставленный django, не предоставляет доступ к set_isolation_level.
Кроме того, вы также можете получить сообщения, предоставленные Вакуумом или Анализом, используя:
эта команда распечатает список с сообщением журнала таких запросов, как «Вакуум» и «Анализ»:
Это может быть полезно для администраторов баз данных ^^
Обратите внимание, что если вы используете Django с югом для выполнения миграции, вы можете использовать следующий код для выполнения VACUUM ANALYZE .
Я не знаю psycopg2 и PostgreSQL, но только apsw и SQLite, поэтому я не могу дать помощь «psycopg2».
Но мне кажется, что PostgreSQL может работать аналогично SQLite, он имеет два режима работы:
- Вне блока транзакций: это семантически эквивалентно наличию блока транзакций вокруг каждой отдельной операции SQL.
- Внутри блока транзакций, отмеченного «BEGIN TRANSACTION» и заканчивающегося «END TRANSACTION»
Если это так, проблема может быть внутри уровня доступа psycopg2. Когда он обычно работает таким образом, что транзакции неявно вставляются до фиксации, не может быть «стандартного способа» для создания вакуума.
Конечно, возможно, что «psycopg2» имеет свой специальный «вакуумный» метод или специальный режим работы, где не запускаются неявные транзакции.
Если таких возможностей не существует, остается одна опция (без изменения уровня доступа;-)):
В большинстве баз данных имеется программа оболочки для доступа к базе данных. Программа может запускать эту программу оболочки с помощью трубы (вводя вакуумную команду в оболочку), используя программу оболочки для создания вакуума. Поскольку вакуум является медленной работой как таковой, запуск внешней программы будет пренебрежимым. Конечно, фактическая программа должна выполнить все неоправданную работу раньше, иначе может быть ситуация с мертвой блокировкой — вакуум должен подождать до конца вашей последней транзакции.
PostgreSQL — как запустить VACUUM из кода вне блока транзакции?
Я использую Python с psycopg2 и пытаюсь запустить полную VACUUM после ежедневной операции, которая вставляет несколько тысяч строк. Проблема в том, что когда я пытаюсь запустить VACUUM в моем коде я получаю следующую ошибку:
Как мне запустить это из кода вне блока транзакции?
Если это имеет значение, у меня есть простой класс абстракции БД, подмножество которого показано ниже для контекста (не запускается, обработка исключений и строки документации опущены, а также внесены корректировки, охватывающие строки):
задан 19 июн ’09, 08:06

@nosklo, Хорошее предложение, но согласно документам Postgres это то же самое, что и COMMIT. — Wayne Koorts
Вы случайно не используете SQLAlchemy? У меня возникла похожая проблема, потому что установка autocommit = True в SqlAlchemy не на самом деле отключить транзакции. С использованием set_isolation_level — это обходной путь, который обращается к внутренним методам соединения psycopg2. — Michael Aquilina
@MichaelAquilina Я считаю, что в то время (это было 6 лет назад) это было частью проекта, который не использовал ORM. — Wayne Koorts
6 ответы
После дополнительных поисков я обнаружил свойство isolated_level объекта подключения psycopg2. Оказывается, изменив это на 0 выведет вас из блока транзакции. Ее решает изменение метода вакуумирования вышеуказанного класса на следующий. Обратите внимание, что я также установил уровень изоляции обратно на тот, который был ранее на всякий случай (кажется, 1 по умолчанию).
Эта статья (в конце этой страницы) дает краткое объяснение уровней изоляции в этом контексте.
ответ дан 11 мар ’20, в 21:03

Или, избегая магических чисел: self.conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT) — Нуно Андре
В то время как полное вакуумирование вызывает сомнения в текущих версиях postgresql, принудительное выполнение «анализа вакуума» или «переиндексации» после определенных массовых действий может улучшить производительность или очистить использование диска. Это специфично для postgresql, и его необходимо очистить, чтобы он работал правильно с другими базами данных.
К сожалению, прокси-сервер подключения, предоставляемый django, не предоставляет доступа к set_isolation_level.
Кроме того, вы также можете получать сообщения от Vacuum или Analyze, используя:
эта команда распечатывает список с сообщениями журнала таких запросов, как Vacuum и Analyze:
Это может быть полезно администраторам баз данных ^^
Вам нужно запустить cursor.execute (‘VACUUM FULL VERBOSE’), чтобы действительно получить что-то в этом свойстве. — Влакс
Обратите внимание: если вы используете Django с South для выполнения миграции, вы можете использовать следующий код для выполнения VACUUM ANALYZE .
Я не знаю psycopg2 и PostgreSQL, но знаю только apsw и SQLite, поэтому думаю, что не могу помочь вам с «psycopg2».
Но мне кажется, что PostgreSQL может работать так же, как SQLite, у него есть два режима работы:
- Вне блока транзакции: семантически эквивалентен блоку транзакции вокруг каждой отдельной операции SQL.
- Внутри блока транзакции, который отмечен надписью «НАЧАТЬ ТРАНЗАКЦИЮ» и завершен надписью «КОНЕЦ ТРАНЗАКЦИИ».
В этом случае проблема может быть внутри слоя доступа psycopg2. Когда он обычно работает таким образом, что транзакции неявно вставляются до тех пор, пока не будет сделана фиксация, не может быть «стандартного способа» создать вакуум.
Конечно, возможно, что у «psycopg2» есть особый метод «вакуума» или особый режим работы, в котором неявные транзакции не запускаются.
Когда таких возможностей нет, остается один единственный вариант (без изменения уровня доступа ;-)):
Большинство баз данных имеют программу оболочки для доступа к базе данных. Программа могла запускать эту программу оболочки с конвейером (вводя команду вакуума в оболочку), таким образом используя программу оболочки для создания вакуума. Поскольку вакуум — медленная операция как таковая, запуском внешней программы можно пренебречь. Конечно, реальная программа должна заранее зафиксировать всю незавершенную работу, иначе может возникнуть ситуация тупиковой блокировки — вакуум должен дождаться завершения вашей последней транзакции.
Postgresql как запустить что то вне транзакции
PostgreSQL-как запустить вакуум из кода вне блока транзакций?
Я использую Python с psycopg2, и я пытаюсь запустить полный VACUUM после ежедневной операции, которая вставляет несколько тысяч строк. Проблема в том, что когда я пытаюсь запустить VACUUM команда в моем коде я получаю следующую ошибку:
как запустить это из кода вне блока транзакций?
если это имеет значение, у меня есть простой класс абстракции DB, подмножество которого отображается ниже для контекста (не выполняется, обработка исключений и docstrings опущены, и сделаны корректировки линии охвата):
6 ответов
после дополнительного поиска я обнаружил свойство isolation_level объекта подключения psycopg2. Оказывается, изменив это на 0 выведет вас из блока транзакций. Изменение метода вакуума вышеуказанного класса на следующий решает его. Обратите внимание, что я также установил уровень изоляции на то, что он ранее был на всякий случай (кажется 1 по умолчанию).
в этой статье (в конце этой страницы) предоставляет краткое описание объяснение уровней изоляции в этом контексте.
в то время как vacuum full сомнителен в текущих версиях postgresql, принудительный «вакуумный анализ» или «переиндекс» после определенных массовых действий может повысить производительность или очистить использование диска. Это специфично для postgresql и должно быть очищено, чтобы сделать правильную вещь для других баз данных.
к сожалению, прокси-сервер соединения, предоставляемый django, не предоставляет доступ к set_isolation_level.
кроме того, вы также можете получить сообщения, данные вакуумом или анализировать, используя:
эта команда печатает список с сообщением журнала запросов, таких как Vacuum и Analyse:
Это может быть полезно для DBAs ^^
Примечание Если вы используете Django с South для выполнения миграции, вы можете использовать следующий код для выполнения VACUUM ANALYZE .
Я не знаю psycopg2 и PostgreSQL, но только apsw и SQLite, поэтому я думаю, что не могу дать помощь «psycopg2».
но мне кажется, что PostgreSQL может работать так же, как SQLite, он имеет два режима работы:
- вне блока транзакций: это семантически эквивалентно иметь блок транзакций вокруг каждой операции SQL
- внутри блока транзакций, который отмечен «начать транзакцию» и заканчивается «конец Сделка»
когда это так, проблема может быть внутри уровня доступа psycopg2. Когда он обычно работает таким образом, что транзакции имплицитно вставляются до фиксации, не может быть «стандартного способа» создать вакуум.
конечно, возможно, что » psycopg2 «имеет свой специальный метод» вакуума » или специальный режим работы, где неявные транзакции не запускаются.
когда таких возможностей не существует, там остается один единственный вариант (без изменения уровня доступа ):
большинство баз данных имеют оболочку программы для доступа к базе данных. Программа может запустить эту программу оболочки с помощью трубы (ввод команды vacuum в оболочку), таким образом, используя программу оболочки для создания вакуума. Поскольку вакуум является медленной операцией как таковой, запуск внешней программы будет пренебрежимым. Конечно, фактическая программа должна совершить всю незафиксированную работу раньше, иначе может быть тупиковая ситуация-вакуум должен ждать до конца вашей последней транзакции.
Не делайте этого — вам не нужен полный вакуум. На самом деле, если вы запустите несколько последнюю версию Postgres (скажем, > 8.1), вам даже не нужно запускать обычный вакуум вручную.
PostgreSQL — как запустить VACUUM из кода вне блока транзакции?
Я использую Python с psycopg2 и пытаюсь запустить полную VACUUM после ежедневной операции, которая вставляет несколько тысяч строк. Проблема в том, что когда я пытаюсь запустить VACUUM в моем коде я получаю следующую ошибку:
Как мне запустить это из кода вне блока транзакции?
Если это имеет значение, у меня есть простой класс абстракции БД, подмножество которого показано ниже для контекста (не запускается, обработка исключений и строки документации опущены, а также внесены корректировки, охватывающие строки):
задан 19 июн ’09, 08:06

@nosklo, Хорошее предложение, но согласно документам Postgres это то же самое, что и COMMIT. — Wayne Koorts
Вы случайно не используете SQLAlchemy? У меня возникла похожая проблема, потому что установка autocommit = True в SqlAlchemy не на самом деле отключить транзакции. С использованием set_isolation_level — это обходной путь, который обращается к внутренним методам соединения psycopg2. — Michael Aquilina
@MichaelAquilina Я считаю, что в то время (это было 6 лет назад) это было частью проекта, который не использовал ORM. — Wayne Koorts
6 ответы
После дополнительных поисков я обнаружил свойство isolated_level объекта подключения psycopg2. Оказывается, изменив это на 0 выведет вас из блока транзакции. Ее решает изменение метода вакуумирования вышеуказанного класса на следующий. Обратите внимание, что я также установил уровень изоляции обратно на тот, который был ранее на всякий случай (кажется, 1 по умолчанию).
Эта статья (в конце этой страницы) дает краткое объяснение уровней изоляции в этом контексте.
ответ дан 11 мар ’20, в 21:03

Или, избегая магических чисел: self.conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT) — Нуно Андре
В то время как полное вакуумирование вызывает сомнения в текущих версиях postgresql, принудительное выполнение «анализа вакуума» или «переиндексации» после определенных массовых действий может улучшить производительность или очистить использование диска. Это специфично для postgresql, и его необходимо очистить, чтобы он работал правильно с другими базами данных.
К сожалению, прокси-сервер подключения, предоставляемый django, не предоставляет доступа к set_isolation_level.
Кроме того, вы также можете получать сообщения от Vacuum или Analyze, используя:
эта команда распечатывает список с сообщениями журнала таких запросов, как Vacuum и Analyze:
Это может быть полезно администраторам баз данных ^^
Вам нужно запустить cursor.execute (‘VACUUM FULL VERBOSE’), чтобы действительно получить что-то в этом свойстве. — Влакс
Обратите внимание: если вы используете Django с South для выполнения миграции, вы можете использовать следующий код для выполнения VACUUM ANALYZE .
Я не знаю psycopg2 и PostgreSQL, но знаю только apsw и SQLite, поэтому думаю, что не могу помочь вам с «psycopg2».
Но мне кажется, что PostgreSQL может работать так же, как SQLite, у него есть два режима работы:
- Вне блока транзакции: семантически эквивалентен блоку транзакции вокруг каждой отдельной операции SQL.
- Внутри блока транзакции, который отмечен надписью «НАЧАТЬ ТРАНЗАКЦИЮ» и завершен надписью «КОНЕЦ ТРАНЗАКЦИИ».
В этом случае проблема может быть внутри слоя доступа psycopg2. Когда он обычно работает таким образом, что транзакции неявно вставляются до тех пор, пока не будет сделана фиксация, не может быть «стандартного способа» создать вакуум.
Конечно, возможно, что у «psycopg2» есть особый метод «вакуума» или особый режим работы, в котором неявные транзакции не запускаются.
Когда таких возможностей нет, остается один единственный вариант (без изменения уровня доступа ;-)):
Большинство баз данных имеют программу оболочки для доступа к базе данных. Программа могла запускать эту программу оболочки с конвейером (вводя команду вакуума в оболочку), таким образом используя программу оболочки для создания вакуума. Поскольку вакуум — медленная операция как таковая, запуском внешней программы можно пренебречь. Конечно, реальная программа должна заранее зафиксировать всю незавершенную работу, иначе может возникнуть ситуация тупиковой блокировки — вакуум должен дождаться завершения вашей последней транзакции.
С PostgreSQL — как запустить вакуум из кода вне блока транзакции?
Я использую Python с psycopg2 и я'м пытаюсь запустить полную «вакуума» после ежедневной эксплуатации, который вставляет несколько тысяч строк. Проблема в том, что когда я пытаюсь выполнить команду «вакуума» в мой код я получаю следующую ошибку:
Как это запустить из кода вне блока транзакций?
Если это имеет значение, у меня есть простой класс абстракции БД, подмножеством которого представлена ниже для связи (не выполнимое, обработки исключений и комментарии опущены и линии, охватывающие корректировок):
![]()
После поисков я обнаружил свойство isolation_level в psycopg2 объекта связи. Получается, что изменение этого на » 0 » переместит вас из блока транзакций. Изменение вакуумный метод выше классом на следующий решает. Обратите внимание, что я также установить уровень изоляции вернемся к тому, что он раньше был на всякий случай (кажется, 1 по умолчанию).
В этой статье (ближе к концу страницы) содержит краткое описание уровней изоляции в этом контексте.
Кроме того, вы также можете получить сообщения, приведенные в вакууме или анализа, используя:
эта команда выведет список с сообщением журнала запросов, как вакуумный и анализировать:
Это может быть полезно для администраторов ^^
Пока вакуум полный сомнительна в текущих версиях PostgreSQL, заставляя 'вакуум анализировать' или 'переиндексация' после определенного массовые действия могут повысить производительность, очистить диск или использования. Это в PostgreSQL конкретные, и должен быть убран, чтобы делать правильные вещи для других баз данных.
К сожалению, прокси-соединения, предоставляемая Django не'т предоставить доступ к set_isolation_level.
Обратите внимание, если вы're, используя Django, и в Южной выполнить миграцию вы можете использовать следующий код, чтобы выполнить вакуум анализа .
![]()
Я не'т знаю, что psycopg2 и PostgreSQL, но только apsw и SQLite, так что я думаю, я не могу дать «и psycopg2» Помоги.
Но кажется мне, что в PostgreSQL может работать аналогично как SQLite, она имеет два режима работы:
- За пределами блока транзакций: это семантически эквивалентно для блока операций по каждой операции SQL
- Внутри блока транзакции, которые отмечены и»начать и» сделка, и заканчивается на «Конец операции»и
В этом случае, проблема может быть внутри слоя доступа psycopg2. Когда это происходит, как правило, работают таким образом, что операции implicitely вставлен до коммита, не может быть и нет «стандартной», чтобы создать вакуум.
Конечно, это может быть возможным, что «psycopg2″ есть свои специальные и»вакуума» и способ, или специальный режим, где начал нет скрытой проводки.
Когда таких возможностей не существует, там остается один единственный вариант (без изменения уровня доступа ):
Большинство баз данных имеют программ оболочки для доступа к базе данных. Программа может запустить программу оболочки с трубой (входя в вакуум-команда в консоли), таким образом, используя программу оболочки, чтобы сделать вакуум. Поскольку вакуум является медленной операцией как таковой, запуск внешних программ будет очень маленьким. Конечно, реальная программа должна фиксировать все неподтвержденными работу раньше, то там еще может быть тупиковой ситуации — вакуум должен ждать до конца вашей последней сделки.
Автономные транзакции в PostgreSQL
Начнем с определения того, что такое автономные транзакции в принципе:
Автономные транзакции позволяют создавать новые подтранзакции (subtransaction), которые могут сохранять или отменять изменения вне зависимости от родительской транзакции. Подробнее тут.
Реализованы они в СУБД Oracle, и являются очень гибким и удобным средством. Самым популярным (но далеко не единственным) использованием автономных транзакций является логирование. Рассмотрим несложный пример. Представьте себе следующую ситуацию — в вашей БД реализована длинная и сложная хранимая процедура, например ежемесячный биллинг. Важные события вы наверняка хотели бы видеть в таблице логов. Вы, конечно, можете просто писать в нее безо всяких ухищрений. Но есть один серьезный недостаток — если в процедуре происходит необработанная ошибка — транзакция откатывается вместе со всеми записями в таблицу логов. Тут на помощь и приходят автономные транзакции. Они выполняются независимо от родительской транзакции, и вы можете увидеть записи в таблице логов еще до того, как закончилось выполнение логгируемой процедуры биллинга.
Перейдем же к теме топика. Несмотря на претенциозный заголовок, в PostgreSQL автономных транзакций не существует. Но есть способ, с помощью которого мы можем получить схожий результат.
dblink
Во-первых, нам понадобится contrib-модуль dblink. Этот модуль позволяет с помощью своих функций обращаться к другому экземпляру PostgreSQL. Подробное описание выходит за рамки топика. От себя скажу, что dblink — один из нескольких полезнейших contrib-модулей, которые я всегда устанавливаю независимо от задач, решаемых БД.
Пример
Покажу описываемый прием на примере из начала топика. Реализуем логирование на «автономных» транзакциях.
Создаем таблицу логов:
CREATE TABLE » public «.»logs» (
«log_id» BIGSERIAL,
«source» TEXT NOT NULL ,
» level » TEXT NOT NULL ,
«message» TEXT NOT NULL ,
«time_added» TIMESTAMP WITHOUT TIME ZONE DEFAULT now() NOT NULL ,
CONSTRAINT «logs_pkey» PRIMARY KEY («log_id»)
) WITH OIDS;
* This source code was highlighted with Source Code Highlighter .
Создадим функцию для логгирования:
CREATE OR REPLACE FUNCTION » public «.»log»( IN p_source text, IN p_level text, IN p_message text)
RETURNS void AS
$$
DECLARE
INSERT_SQL text := ‘INSERT INTO public.logs (source, level, message) VALUES (‘ ‘[SOURCE]’ ‘,’ ‘[LEVEL]’ ‘,’ ‘[MESSAGE]’ ‘)’ ;
BEGIN
IF p_level != ‘ERROR’ AND p_level != ‘WARNING’
AND p_level != ‘INFO’ AND p_level != ‘DEBUG’ THEN
RAISE EXCEPTION ‘Log level should be one of the following types: ERROR, WARNING, INFO, DEBUG’ ;
END IF ;
INSERT_SQL := replace(INSERT_SQL, ‘[SOURCE]’ , p_source);
INSERT_SQL := replace(INSERT_SQL, ‘[LEVEL]’ , p_level);
INSERT_SQL := replace(INSERT_SQL, ‘[MESSAGE]’ , p_message);
PERFORM dblink_exec( ‘dbname=’ || current_database(), INSERT_SQL);
END ;
$$ LANGUAGE ‘plpgsql’ ;
* This source code was highlighted with Source Code Highlighter .
Теперь в любой момент мы можем вызвать функцию «log» и запись тут же появится в таблице логов независимо от статуса транзакции, в во время которой мы ее вызвали.
* This source code was highlighted with Source Code Highlighter .
Как видите, весь прием состоит в том, что мы записываем в таблицу логов с помощью функции «dblink_exec». Это означает, что создается новые соединение, сессия и транзакция, в контексте которых и происходит запись.