|
psql и транзакции
|
|||
---|---|---|---|
#18+
Всем привет. Хочу понять, кто начинает и завершает транзакции при включенном автокоммите. Запускаю psql, подключаюсь к базе, запускаю запрос типа: Код: sql 1.
Потом убиваю процесс psql. В другом подключении делаю: Код: sql 1.
И вижу, что через 30 секунд содержимое some_field становится 'updated by disconnected client'. Выглядит так, что сервер сам при отключившемся клиенте коммитит транзакции этого клиента. В доке написано обтекаемо, я понял так, что psql скрыто от пользователя сам выполняет BEGIN и COMMIT. Но раз при отключенном клиенте коммит всё же происходит, то это делает сервер ? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2019, 08:27 |
|
psql и транзакции
|
|||
---|---|---|---|
#18+
Сисдба Мастеркеевич В доке написано обтекаемо, я понял так, что psql скрыто от пользователя сам выполняет BEGIN и COMMIT. Но раз при отключенном клиенте коммит всё же происходит, то это делает сервер ? вы не правильно поняли.... при autocommit=on просто begin/commit не вызываются вообще и запросы просто отправляются на базу. соответственно как запрос выполнился - он же закомитился ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2019, 11:28 |
|
psql и транзакции
|
|||
---|---|---|---|
#18+
Maxim Boguk, Получается, что запустив некий запрос из psql без явного управления транзакцией, можно быть уверенным, что даже если произойдет отключение psql (обрыв соединения), запрос доработает до конца и результат закоммитится ? (ну если не будет каких-то исключений) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2019, 15:08 |
|
psql и транзакции
|
|||
---|---|---|---|
#18+
Сисдба Мастеркеевич Maxim Boguk, Получается, что запустив некий запрос из psql без явного управления транзакцией, можно быть уверенным, что даже если произойдет отключение psql (обрыв соединения), запрос доработает до конца и результат закоммитится ? (ну если не будет каких-то исключений) нет... такую гарантию нельзя получить ни с autocommit=off ни с autocommit=on если запрос очень долгий и из под него psql отстрелили - вполне может и откатиться на полпути... можно сказать только одно 100% он или выполнится или нет... не будет ситуации полусделанного запроса. Для того чтобы быть уверенным - надо двухфазные транзакции использовать и внешний менеджер двухфазных транзакций. Но это очень дорого по ресурсам базы и там много подводных камней. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2019, 15:57 |
|
psql и транзакции
|
|||
---|---|---|---|
#18+
Maxim Boguk если запрос очень долгий и из под него psql отстрелили - вполне может и откатиться на полпути... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2019, 16:32 |
|
psql и транзакции
|
|||
---|---|---|---|
#18+
Сисдба Мастеркеевич Maxim Boguk если запрос очень долгий и из под него psql отстрелили - вполне может и откатиться на полпути... Как только база замечает что клиент отвалился - запрос в общем случае прерывается... а вот когда наступит "как только" оно зависит от очень могих факторов и не настраивается по этому поводу... ну и помимо "общего" случая есть много частных... В общем если у вас psql отвалился не дожидаясь ответа от базы - вы не знаете выполнился запрос или нет (и даже дошел он до базы или нет тоже не знаете). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2019, 17:34 |
|
psql и транзакции
|
|||
---|---|---|---|
#18+
Я создал тему про 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 - ГеоргийК
Нравится:
Не нравится:
|
|||
18.10.2024, 10:26 |
|
|
start [/forum/topic.php?fid=53&tid=1994946]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
410ms |
get topic data: |
60ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
others: | 253ms |
total: | 826ms |
0 / 0 |