powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / psql и транзакции
7 сообщений из 7, страница 1 из 1
psql и транзакции
    #39887305
Сисдба Мастеркеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

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

Запускаю 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
psql и транзакции
    #39887369
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сисдба Мастеркеевич

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


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

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

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


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

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


Как только база замечает что клиент отвалился - запрос в общем случае прерывается... а вот когда наступит "как только" оно зависит от очень могих факторов и не настраивается по этому поводу... ну и помимо "общего" случая есть много частных...
В общем если у вас psql отвалился не дожидаясь ответа от базы - вы не знаете выполнился запрос или нет (и даже дошел он до базы или нет тоже не знаете).
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
psql и транзакции
    #40138921
ГеоргийК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
Я создал тему про 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
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / psql и транзакции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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