Size: a a a

pgsql – PostgreSQL

2020 December 25

p

prll in pgsql – PostgreSQL
/
источник

p

prll in pgsql – PostgreSQL
Из г шаг за
Ну. Б эээ. Х. З и
источник

KK

Konstantin Knizhnik in pgsql – PostgreSQL
Victor Yegorov
если на синхронной реплике применилось, а масетр “ушёл”, то получается:
- клиенту подтверждения не было, он вправе считать, что был откат
- после активации синхронной реплики транзакция становиться видна

я согласен, что на мастере WAL был записан и буде проигран. но только если мы промотим реплику – получается расхождение между мнением клиента и состоянием базы
да.
Но вот это утверждение не верно: "клиенту подтверждения не было, он вправе считать, что был откат"
Если связь с сервером оборвалась, то статус транзакции клиенту не известен. Она может оказаться как закоммиченной, так и нет.
источник

VY

Victor Yegorov in pgsql – PostgreSQL
Konstantin Knizhnik
да.
Но вот это утверждение не верно: "клиенту подтверждения не было, он вправе считать, что был откат"
Если связь с сервером оборвалась, то статус транзакции клиенту не известен. Она может оказаться как закоммиченной, так и нет.
я исхожу из того, что транзакция либо подтверждена и зафиксирована. либо нет. т.е. тут всё строго должно быть.
ибо SQL как язык не даёт возможности проверить статус транзакции
источник

AL

Alexey Lesovsky in pgsql – PostgreSQL
Konstantin Knizhnik
да.
Но вот это утверждение не верно: "клиенту подтверждения не было, он вправе считать, что был откат"
Если связь с сервером оборвалась, то статус транзакции клиенту не известен. Она может оказаться как закоммиченной, так и нет.
@dimuska139
что думаешь об этом?
источник

KK

Konstantin Knizhnik in pgsql – PostgreSQL
Victor Yegorov
я исхожу из того, что транзакция либо подтверждена и зафиксирована. либо нет. т.е. тут всё строго должно быть.
ибо SQL как язык не даёт возможности проверить статус транзакции
Транзакция это не кот Шрёдингера. Она действительно закоммичена или нет.
Но только клиент про это может не знать.
Вы что то попросили, вам ответили, а вы ответ не услышали... Было ли выполнено то, что вы просили?
источник

D

Dmitriy in pgsql – PostgreSQL
Alexey Lesovsky
@dimuska139
что думаешь об этом?
Я вообще не в теме))))
источник

Ð

Ð in pgsql – PostgreSQL
Victor Yegorov
я исхожу из того, что транзакция либо подтверждена и зафиксирована. либо нет. т.е. тут всё строго должно быть.
ибо SQL как язык не даёт возможности проверить статус транзакции
закоммиченность или нет транзакции это забота клиента, если он не получил исключение, значит все прошло как надо
источник

Ð

Ð in pgsql – PostgreSQL
но бывают редкие случаи когда сервер виноват, об этом говорят выше
источник

VY

Victor Yegorov in pgsql – PostgreSQL
Konstantin Knizhnik
Транзакция это не кот Шрёдингера. Она действительно закоммичена или нет.
Но только клиент про это может не знать.
Вы что то попросили, вам ответили, а вы ответ не услышали... Было ли выполнено то, что вы просили?
в ситуации, когда:
- клиент явно начал транзакцию через COMMIT
- сервер “ушёл” по не зависящим от клиента причинам ничего не сообщив
- иными словами, клиент не получил подтверждение фиксации

клиент вправе считать транзакцию оборванной, ибо ACID
источник

Ð

Ð in pgsql – PostgreSQL
Victor Yegorov
в ситуации, когда:
- клиент явно начал транзакцию через COMMIT
- сервер “ушёл” по не зависящим от клиента причинам ничего не сообщив
- иными словами, клиент не получил подтверждение фиксации

клиент вправе считать транзакцию оборванной, ибо ACID
если клиент послал коммит ушел в айдл с потерей пакетов - это его проблемы, он не получил исключение, значит все нормально. А то что он получит тайм-аут - это его проблемы, и его сети, а не сервера. Сервер получил коммит и сделал что от него требовалось.
источник

AL

Alexey Lesovsky in pgsql – PostgreSQL
Dmitriy
Я вообще не в теме))))
тогда такой вопрос... как с точки зрения бэкенд-разработки обрабатывать такую ситуацию.

ты пишешь код, который делает update в БД. но в процессе апдейта, сетевое соединение до БД может оборваться (не такая уж и редкая ситуация). Как мне кажется класический вариант посчитать это ошибкой и вернуть клиенту ошибку. Но при этом апдейт по факту может завершиться и стейт в БД изменится так как и хотел клиент (хотя клиенту то приложение вернуло ошибку)
источник

VY

Victor Yegorov in pgsql – PostgreSQL
Ð
если клиент послал коммит ушел в айдл с потерей пакетов - это его проблемы, он не получил исключение, значит все нормально. А то что он получит тайм-аут - это его проблемы, и его сети, а не сервера. Сервер получил коммит и сделал что от него требовалось.
я не говорю про тупняки, не передёргивайте. я говорю о счастливом случае когда мастер-база умирает в определённый момент
источник

KK

Konstantin Knizhnik in pgsql – PostgreSQL
Ребята, ну давайте же думать логически.
Сёрвер в какой-то момент должен принять решение: ибо, как было сказано - ACID.
Ну вот он его принял.
Ну клиент об этом ещё не знает. Между ними километры оптоволкна, IP-стэк и ещё куча всякой фигни.
Но решение уже принято. И от того, подучит ли клиент ответ или нет - ничего уже не зависит.
источник

Ð

Ð in pgsql – PostgreSQL
Victor Yegorov
я не говорю про тупняки, не передёргивайте. я говорю о счастливом случае когда мастер-база умирает в определённый момент
это вы передергиваете "тупняками", я говорю что проблемы сети клиента - это не проблемы сервера.
источник

VY

Victor Yegorov in pgsql – PostgreSQL
Ð
это вы передергиваете "тупняками", я говорю что проблемы сети клиента - это не проблемы сервера.
а я про проблемы сети клиента ни разу ничего и несказал
источник

Ð

Ð in pgsql – PostgreSQL
Если сервер не сказал явно, что транзакция завалена, это успешный коммит. Примерно как вызвать такси и закрыть приложение, не дождавшись уведомления о том, что тачка приехала.
источник

Ð

Ð in pgsql – PostgreSQL
Надо проверить статус - надо послать селект и проверить, если сеть отвалилась. Восстановить состояние клиента до актуального.
источник

D

Dmitriy in pgsql – PostgreSQL
Alexey Lesovsky
тогда такой вопрос... как с точки зрения бэкенд-разработки обрабатывать такую ситуацию.

ты пишешь код, который делает update в БД. но в процессе апдейта, сетевое соединение до БД может оборваться (не такая уж и редкая ситуация). Как мне кажется класический вариант посчитать это ошибкой и вернуть клиенту ошибку. Но при этом апдейт по факту может завершиться и стейт в БД изменится так как и хотел клиент (хотя клиенту то приложение вернуло ошибку)
То, что клиенту в таком случае надо ошибку показывать - это точно. Ну а саму ситуацию надо просто логировать (то, какой метод вызывался, с какими параметрами и какая ошибка возникла) - и по логам уже разбираться, что там произошло. Я логи ошибок, например, смотрю ежедневно. Если надо - лезу в базу. То есть ситуацию, когда для юзера апдейт не прошёл, а по факту прошёл - можно выявить. Вопрос правда ещё в том, к каким последствиям всё это приводит.
источник

VY

Victor Yegorov in pgsql – PostgreSQL
ну тут нужен кто-то с опытом прикладной бэкенд разработки — как реагировать на то, что сервер не дал ответа.
источник