DBeaver и auto-commit

«Пост-Грэс-Кью-Эл» свободная объектно-реляционная СУБД. Обмениваемся вопросами и ответами о её работе.
Ответить
AntonS
Сообщения: 128
Зарегистрирован: Пт июн 03, 2022 8:51 am

DBeaver и auto-commit

Сообщение AntonS »

В документации указано, что:
По умолчанию (без BEGIN) PostgreSQL выполняет транзакции в режиме «autocommit» (автофиксация), то есть каждый оператор выполняется в отдельной транзакции, которая неявно фиксируется.

Поэтому в DBeaver настройка Auto-commit в свойствах соединения базы данных PostgreSQL по умолчанию включена. Если её выключить, сняв флажок Auto-commit в разделе Инициализация конфигурации соединения, то на панели инструментов вверху становятся активными кнопки Commit и Rollback
DBeaver_autocommit.png
DBeaver_autocommit.png (45.34 КБ) 23501 просмотр

Кроме этого:

1. DBeaver после соединения с базой данных PostgreSQL сразу открывает 2 сессии, обозначенные в столбце application_name как Main <имя БД> и Metadata <имя БД>. При открытии окна редактора SQL из контекстного меню Новый SQL скрипт открывается еще одна сессия, обозначенная как SQLEditor <имя скрипта.sql>. Если Auto-commit выключен, то после выполнения команды SQL в этом редакторе, даже SELECT, открывается транзакция, которая закрывается после нажатия Commit или Rollback

Код: Выделить всё

 pid  |        state        |             application_name              |              query
------+---------------------+-------------------------------------------+----------------------------------
 3034 | idle                | DBeaver 23.2.1 - Main <demo>              | COMMIT
 3035 | idle                | DBeaver 23.2.1 - Metadata <demo>          | SELECT * FROM pg_catalog.pg_enum
 3040 | idle in transaction | DBeaver 23.2.1 -  <Script-6.sql> | SHOW search_path
(3 rows)
Долгие открытые транзакции в PostgreSQL нежелательны. Чтобы не было забытых неактивных транзакций, на уровне экземпляра должен быть явно задан параметр idle_in_transaction_session_timeout, но по умолчанию он отключен.

2. Побочный эффект неявного открытия транзакции состоит в том что функция now() возвращает дату и время timestamp на момент начала транзакции, т.к. она реализована аналогично функции transaction_timestamp()

Код: Выделить всё

demo=*# SELECT now(), transaction_timestamp(), clock_timestamp();
              now              |     transaction_timestamp     |        clock_timestamp
-------------------------------+-------------------------------+-------------------------------
 2025-12-06 10:29:57.944149+03 | 2025-12-06 10:29:57.944149+03 | 2025-12-06 10:36:25.900463+03
(1 row)
Если транзакция была открыта некоторое время назад, то now() вернет дату и время из прошлого.

Таким образом, лучше без необходимости Auto-commit не отключать.

Другие темы по DBeaver:
DBeaver - экспорт результатов запросов в CSV и XLSX
DBeaver - создание ER-модели базы данных
Сравнение структуры баз данных, схем и объектов по типам с помощью DBeaver
Аватара пользователя
SQL*Plus
Сообщения: 354
Зарегистрирован: Ср апр 20, 2022 1:09 pm

Re: DBeaver и auto-commit

Сообщение SQL*Plus »

Что показывает при нажатии "Test Connection"?
Какой уровень изоляции транзакций при этом устанавливается?
AntonS
Сообщения: 128
Зарегистрирован: Пт июн 03, 2022 8:51 am

Re: DBeaver и auto-commit

Сообщение AntonS »

При тестировании соединения DBeaver выводит в отдельном информационном окне время, затраченное на установление соединения и информацию о версиях СУБД, ОС сервера и драйвера PostgreSQL JDBC.

Текст на скриншоте Sets auto-commit mode for all connections это всплывающая подсказка к флажку Auto-commit, и настройка уровня изоляции транзакций Isloation level к ней не имеет отношения

Уровень изоляции транзакций можно смотреть в текущей сессии PostgreSQL функцией current_setting('transaction_isolation'). В обоих случаях, как при включенном auto-commit, так и при при отключенном, уровень изоляции транзакций оказывался неизменным: read committed (по умолчанию).

Код: Выделить всё

demo=# SELECT current_setting('transaction_isolation');
 current_setting
-----------------
 read committed
(1 row)
AntonS
Сообщения: 128
Зарегистрирован: Пт июн 03, 2022 8:51 am

Re: DBeaver и auto-commit

Сообщение AntonS »

Если в сессии psql переменной AUTOCOMMIT установить значение off, то её поведение станет аналогичным выключенному Auto-commit в DBeaver. Это объясняется тем, что отключение AUTOCOMMIT в PostgreSQL это неявная команде начала транзакции BEGIN; Поскольку любой запрос в БД Postgresql (даже SELECT) это открытие транзакции, то после его выполнения сессии перейдет в idle in transaction: серверный процесс находится внутри транзакции, но в настоящее время не выполняет никакой запрос

Для примера, выполним в сессии 1 и отметим, что после выполнения SELECT в приглашении psql появилась звездочка * обозначающая открытую транзакцию:

Код: Выделить всё

demo=# SELECT pg_backend_pid();
 pg_backend_pid
----------------
           3078
(1 row)
demo=# \set AUTOCOMMIT off
demo=*# SELECT now();
              now
-------------------------------
 2026-02-08 10:55:45.990987+03
(1 row)
Затем, из представления pg_stat_activity в сессии 2 - ожидаемо, следует что сессия 1 перешла в состояние idle in transaction:

Код: Выделить всё

demo=# SELECT state FROM pg_stat_activity WHERE pid = 3078;
 state
-------
 idle in transaction
(1 row)
Теперь, в сессии 1 выполним отмену транзакции:

Код: Выделить всё

demo=*# ROLLBACK;
ROLLBACK
Из сессии 2 видно, что сессия 1 в состоянии idle:

Код: Выделить всё

demo=# SELECT state FROM pg_stat_activity WHERE pid = 3078;
 state
-------
 idle
(1 row)
Благодарность за подсказанную идею направляется пользователя XoxxFap телеграм чата pgsql – PostgreSQL 8-)
Ответить