Гость
Map
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / psql и транзакции / 7 сообщений из 7, страница 1 из 1
11.11.2019, 08:27
    #39887305
Сисдба Мастеркеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
psql и транзакции
Всем привет.

Хочу понять, кто начинает и завершает транзакции при включенном автокоммите.

Запускаю psql, подключаюсь к базе, запускаю запрос типа:
Код: sql
1.
UPDATE some_table t SET some_field = 'updated by disconnected client' FROM (SELECT id, pg_sleep(30) FROM some_table WHERE id = 123) t2 WHERE t2.id = t.id;


Потом убиваю процесс psql.
В другом подключении делаю:
Код: sql
1.
SELECT id, some_field FROM some_table WHERE id = 123;


И вижу, что через 30 секунд содержимое some_field становится 'updated by disconnected client'.

Выглядит так, что сервер сам при отключившемся клиенте коммитит транзакции этого клиента.

В доке написано обтекаемо, я понял так, что psql скрыто от пользователя сам выполняет BEGIN и COMMIT. Но раз при отключенном клиенте коммит всё же происходит, то это делает сервер ?
...
Рейтинг: 0 / 0
11.11.2019, 11:28
    #39887369
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
psql и транзакции
Сисдба Мастеркеевич

В доке написано обтекаемо, я понял так, что psql скрыто от пользователя сам выполняет BEGIN и COMMIT. Но раз при отключенном клиенте коммит всё же происходит, то это делает сервер ?


вы не правильно поняли.... при autocommit=on просто begin/commit не вызываются вообще и запросы просто отправляются на базу.
соответственно как запрос выполнился - он же закомитился
...
Рейтинг: 0 / 0
11.11.2019, 15:08
    #39887506
Сисдба Мастеркеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
psql и транзакции
Maxim Boguk,

Получается, что запустив некий запрос из psql без явного управления транзакцией, можно быть уверенным, что даже если произойдет отключение psql (обрыв соединения), запрос доработает до конца и результат закоммитится ? (ну если не будет каких-то исключений)
...
Рейтинг: 0 / 0
11.11.2019, 15:57
    #39887537
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
psql и транзакции
Сисдба Мастеркеевич
Maxim Boguk,

Получается, что запустив некий запрос из psql без явного управления транзакцией, можно быть уверенным, что даже если произойдет отключение psql (обрыв соединения), запрос доработает до конца и результат закоммитится ? (ну если не будет каких-то исключений)


нет... такую гарантию нельзя получить ни с autocommit=off ни с autocommit=on
если запрос очень долгий и из под него psql отстрелили - вполне может и откатиться на полпути...
можно сказать только одно 100% он или выполнится или нет... не будет ситуации полусделанного запроса.

Для того чтобы быть уверенным - надо двухфазные транзакции использовать и внешний менеджер двухфазных транзакций. Но это очень дорого по ресурсам базы и там много подводных камней.
...
Рейтинг: 0 / 0
11.11.2019, 16:32
    #39887562
Сисдба Мастеркеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
psql и транзакции
Maxim Boguk
если запрос очень долгий и из под него psql отстрелили - вполне может и откатиться на полпути...
Насколько долгий ? И это где-то настраивается ?
...
Рейтинг: 0 / 0
11.11.2019, 17:34
    #39887624
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
psql и транзакции
Сисдба Мастеркеевич
Maxim Boguk
если запрос очень долгий и из под него psql отстрелили - вполне может и откатиться на полпути...
Насколько долгий ? И это где-то настраивается ?


Как только база замечает что клиент отвалился - запрос в общем случае прерывается... а вот когда наступит "как только" оно зависит от очень могих факторов и не настраивается по этому поводу... ну и помимо "общего" случая есть много частных...
В общем если у вас psql отвалился не дожидаясь ответа от базы - вы не знаете выполнился запрос или нет (и даже дошел он до базы или нет тоже не знаете).
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
18.10.2024, 10:26
    #40138921
ГеоргийК
Участник
[игнорирует гостей]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
psql и транзакции
Я создал тему про autocommit, yj, кажется поторопился, и вопрос сюда: Мне надо бызвать PSQL на выполнение файла с SQL-командами( включающими PLPGSQ-блоки c коммитами), который в самом начале должен данную сессию постгресса избавить от автокоммита. Я пытаюсь это делать так: (оно не работает) \set AUTOCOMMIT = off ; DO $ToDo$ declare rsOK varchar(50) := 'RUN_OK'; rsErr varchar(50) := 'ERRoR'; begin call job.test_proc_with_commit (-17) ; CALL job.log_finish_command (4278 , 'RUN_OK! '); commit;exception when others then CALL job.log_finish_command (4278 , SQLERRM); commit; end; $ToDo$; ВОПРОС в том, как это сделать правильно В документации не нашел. Заранее большое спасибо.
...
Изменено: 18.10.2024, 10:31 - ГеоргийК
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / psql и транзакции / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]