из документации, делается транзакция, которая фиксируется и может быть зафиксрована или отменена по её идентификатору.
Разработчик хотел её использовать для другой задумки - есть несколько сервисов, создается "общая транзакция", в которую ходит каждый сервис, пихает свои данные и под конец она фиксируется скопом.
Это утопичная идея или в принципе реализуемая?
Это называется двухфазный коммит. "Общей" эта транзакция не будет. Её можно только зафиксировать или откатить. Добавлять в неё ничего нельзя. https://postgrespro.ru/docs/postgresql/14/sql-prepare-transaction
Получается, что "доступный" вариант - наплодить таких транзакций и если какая-то упала, откатить их все.
Читайте лучше не про 2pc, а про saga и компенсационные механизмы
Хотели обойтись без этого😊 Спасибо за ответы
Ну, как по мне, 2pc уже редко применяют в современной разработке.
Это поддержка распределённых менеджэров транзакцый (DTM). Чтобы после PREPARE ужэ точно (несмотря ни на какие ребуты серверов, параллельные запросы и прочие неприятности) можно было закоммитить эту транзакцыю. Ну, или откатить. DTM делает PREPARE на всех серверах, на которые влияет распределённая транзакцыя. Ну, или на всех кроме одного главного. Если хоть один не прошёл -- всем делается ROLLBACK. Если все прошли -- всем будет сделан COMMIT. Если пытаться это сделать просто с обычной транзакцыей -- то есть заметная вероятность, что у всех пройдёт, а у одного -- не пройдёт (есть блокировки, которые проверяются непосредственно при commit, есть отдельно вероятность, что с сервером что-то случится до commit -- так что обычная, не подготовленная, транзакцыя имеет право в последний момент откатиться).
А разработчику -- скажыте, что транзакцыи вобще-то должны быть короткими. И если нужно несколько сервисов к одной базе -- то можно, конечно, запихать их через какой-то один endpoint в одну транзакцыю. Есть дажэ что-то, с трудом подходящее под то, что он хочет ( https://www.postgresql.org/docs/current/functions-admin.html#FUNCTIONS-SNAPSHOT-SYNCHRONIZATION ). Но по-хорошэму -- не надо так делать. Собирайте логическую транзакцыю из набора физических. Введите данные от сервиса с пометкой "пока не закоммичено", потом, когда всё будет собрано -- обновите пометку (как например).
Часто. Примерно всегда для прозрачного мульти-мастер шардинга. Очень горячая тема (практически перегретая). Но это немного не та область, которую вы видите, да.
А месячная зп разраба не передалась всё ещё Илье😁😅
Выслушал какие мы …, постгрес про якобы это умеет:-)
вполне возможно. я просто Java программист, у меня DB как прикладное идёт=) и мы сейчас распределённые системы разрабатываем без 2pc. Возможно где то и применяется 2pc, но у нас другие подходы к архитектуре)
Обсуждают сегодня