Size: a a a

pgsql – PostgreSQL

2020 December 25

VY

Victor Yegorov in pgsql – PostgreSQL
транзакция фиксируется только через COMMIT от клиента
источник

кн

коля николай... in pgsql – PostgreSQL
Victor Yegorov
транзакция фиксируется только через COMMIT от клиента
каждый запрос на обнолвение -- транзакция. Необязательно ее явно объявлять
источник

VY

Victor Yegorov in pgsql – PostgreSQL
коля николай
каждый запрос на обнолвение -- транзакция. Необязательно ее явно объявлять
значит за вас это делает клиент/библиотека/ОРМ/прочее
источник

Ð

Ð in pgsql – PostgreSQL
или не делает вообще
источник

кн

коля николай... in pgsql – PostgreSQL
PostgreSQL на самом деле отрабатывает каждый SQL-оператор как транзакцию. Если вы не вставите команду BEGIN, то каждый отдельный оператор будет неявно окружён командами BEGIN и COMMIT (в случае успешного завершения). Группу операторов, окружённых командами BEGIN и COMMIT иногда называют блоком транзакции.
источник

кн

коля николай... in pgsql – PostgreSQL
источник

SZ

Sergey Zhuravlev in pgsql – PostgreSQL
если подойдет астрофизик — то Олег Бартунов )))
источник

Ð

Ð in pgsql – PostgreSQL
коля николай
PostgreSQL на самом деле отрабатывает каждый SQL-оператор как транзакцию. Если вы не вставите команду BEGIN, то каждый отдельный оператор будет неявно окружён командами BEGIN и COMMIT (в случае успешного завершения). Группу операторов, окружённых командами BEGIN и COMMIT иногда называют блоком транзакции.
а как по-другому то сделать? конечно каждый оператор вне транзакции - это отдельная "транзакция", но проблему это не решит
источник

кн

коля николай... in pgsql – PostgreSQL
Ð
а как по-другому то сделать? конечно каждый оператор вне транзакции - это отдельная "транзакция", но проблему это не решит
ну вот тут и вопрос, если при фиксации транзакции мы не дождались ответа и порвали соединение, Postgres может зафиксировать транзакцию или он ее откатит увидив, что соединения нет?
источник

VY

Victor Yegorov in pgsql – PostgreSQL
коля николай
ну вот тут и вопрос, если при фиксации транзакции мы не дождались ответа и порвали соединение, Postgres может зафиксировать транзакцию или он ее откатит увидив, что соединения нет?
ну вот то, что вы процитировали и содержит ответ на этот впрос:
> If you do not issue a BEGIN command, then each individual statement has an implicit BEGIN and (if successful) COMMIT wrapped around it.
источник

VY

Victor Yegorov in pgsql – PostgreSQL
в английском порядок “удобнее” для понимания на мой взгляд
источник

MM

Maksim Milyutin in pgsql – PostgreSQL
коля николай
ну вот тут и вопрос, если при фиксации транзакции мы не дождались ответа и порвали соединение, Postgres может зафиксировать транзакцию или он ее откатит увидив, что соединения нет?
в зависимости от того, насколько раньше бэкенд начнёт взаимодействовать с сокетом соединения с клиентом, если после коммита (при автокоммите и модифицирующей транзакцией без возврата данных) - то транзакция зафиксируется, иначе будет откат
источник

Ð

Ð in pgsql – PostgreSQL
коля николай
ну вот тут и вопрос, если при фиксации транзакции мы не дождались ответа и порвали соединение, Postgres может зафиксировать транзакцию или он ее откатит увидив, что соединения нет?
там все не так просто, если коннекшен целенаправленно убит - то запрос прервется, а если клиент просто потерялся и таймаут сработал на его стороне, и при этом включен автокоммит - то нет.
источник

VY

Victor Yegorov in pgsql – PostgreSQL
угу. и потому надо явно открывать транзакцию
источник

MM

Maksim Milyutin in pgsql – PostgreSQL
был тред https://www.postgresql.org/message-id/CA%2BTgmobakAdqELHtB_t8mPkU8qn4QPSJuCrRzWJFGfCJtpoV%3Dw%40mail.gmail.com и патч https://commitfest.postgresql.org/21/1882/, правящий эту ситуацию, но, увы, прогресс заморозился
источник

KK

Konstantin Knizhnik in pgsql – PostgreSQL
Самое "забавное" тут начинается при использовании синхронной репликации.
Вот мы инициировали коммит, ждём подтверждения от реплик и тут пользователь наживает Ctrl-C.
После чего ... транзакция считается закомиченной и все остальные бэкенды видят её изменения.
Но вот до реплик то она ещё может даже не добралась.
Если в этот момент мастер грохнется и мы переключимся на реплики, то ...  клиенты с удивлением обнаружат, что якобы закоммиченные изменения исчезли.
источник

VY

Victor Yegorov in pgsql – PostgreSQL
а может быть так, что транзакция сначала применяется и синкается на репликах (всех).
и если при этом она на мастере не успела примениться и мастер упал и мы активировали реплику — то она там будет
источник

KK

Konstantin Knizhnik in pgsql – PostgreSQL
Victor Yegorov
а может быть так, что транзакция сначала применяется и синкается на репликах (всех).
и если при этом она на мастере не успела примениться и мастер упал и мы активировали реплику — то она там будет
Нет, так оно быть не может.
Репликация в Постгресе работает по WAL-у.
Пока она не закоммичена локально, на реплику она полностью не попадёт.
источник

VY

Victor Yegorov in pgsql – PostgreSQL
Konstantin Knizhnik
Нет, так оно быть не может.
Репликация в Постгресе работает по WAL-у.
Пока она не закоммичена локально, на реплику она полностью не попадёт.
синхронная реплика в remote_apply применит изменения и они станут “видны” запросам ( из документации по synchronous_commit )
источник

ВК

Виталий Кухарик... in pgsql – PostgreSQL
Konstantin Knizhnik
Нет, так оно быть не может.
Репликация в Постгресе работает по WAL-у.
Пока она не закоммичена локально, на реплику она полностью не попадёт.
Вот прям точно так?)
источник