бы в теории?
стартовал - получил id транзакции
делаешь что-то в ней
закоммитил, указав id
не привязанные к коннекту?
Транзакция всегда в коннекте существует, иначе никак. А долгоживущая может быть, но такие подходы бьют по перформанса
Может быть - как?
Если-бы вы были хоть на секунду правы, то в pg_stat_activity (или как оно там) на всех коннектах, которые сейчас не делают ничего было-бы idle in transaction и база умерла-бы (так как idle in transaction это самое плохое что может быть для Пг).
Two phase commit ближе всего по смыслу, но он не для того.
а это разве не сломает ACID?
А как тогда гарантировать СУБД что вы не начнете параллельно кучей потоков что-то с одним id делать с недетерминированным конечным результатом? Тут тогда придется транзакции внутри транзакции пилить.
Пока что ваше пожелание ничем ни отличается от "стартовал — открыл соединение + открыл транзакцию, висишь idle in transaction, закоммитил и закрыл соединение". В чём будет положительная разница для пользователя? P.S. Если вы скажете "не надо открывать соединение", то я попрошу расписать плюсы этого и т.д. пока не скажете очень конкретные плюсы
Что-то подобное на первый, наивный, взгляд хорошо для банковских транзакций, например, выдача денег в банкомате которая может и на минуту растянуться и держать соединение ради этого банкомата никто не будет. Правда чуть позже увидишь, что нужно несколько коротких транзакций и журналирование каждого действия.
почему для сервера банка проблема держать соединение одну минуту?
Блокировка других действий по счёту.
Да, можно, это даже на практике делают. Почитайте про saga.
"Разрешэние" выдать деньги (блокировка средств на счёте) должна быть отдельной транзакцыей, фиксацыя выдачи или отмены — тожэ. И да, у этого разрешэния надо, конечно, пркдусмотреть средства синхронизацыи с цэнтром: откат тех, которые нк дошли так или иначе (в т.ч. не дошло разрешэние), накат тех, у которых после успешного разрешэния не дошло подтверждение выдачи.
Именно, куча мелких транзакций + журнал всего произошедшего.
а в чем я не прав-то?
Я там и написал.
я прочитал, но не понял в чем конкретно я не прав
В фразе что "транзакции всегда в коннекте существуют". Это неправда.
Вы ответили на вопрос "зачем это нужно?", а я спрашивал "какое конкретно преимущество вы ожидаете по сравнению с открыть отдельное соединение для длительной транзакции?". Вам может быть очевидно, а мне не очевидно. Это нужно для ответа на исходный вопрос "можно ли такое поддержать в PG?". Чтобы на него ответить, нужно знать не название фичи, а какие плюсы ожидаются. Например, "мультимастер" — это просто слово, можно реализовать формально "мультимастер", при этом пользователь не получит плюшек, которые на самом деле хотел.
Обсуждают сегодня