172 похожих чатов

Добрый день. Подскажите, пожалуйста, в чем смысл PREPARE TRANSACTION. Как я понимаю

из документации, делается транзакция, которая фиксируется и может быть зафиксрована или отменена по её идентификатору.
Разработчик хотел её использовать для другой задумки - есть несколько сервисов, создается "общая транзакция", в которую ходит каждый сервис, пихает свои данные и под конец она фиксируется скопом.
Это утопичная идея или в принципе реализуемая?

12 ответов

22 просмотра

Это называется двухфазный коммит. "Общей" эта транзакция не будет. Её можно только зафиксировать или откатить. Добавлять в неё ничего нельзя. https://postgrespro.ru/docs/postgresql/14/sql-prepare-transaction

Tarakanov-Oleg Автор вопроса
Роман Жарков
Это называется двухфазный коммит. "Общей" эта тран...

Получается, что "доступный" вариант - наплодить таких транзакций и если какая-то упала, откатить их все.

Tarakanov Oleg
Получается, что "доступный" вариант - наплодить та...

Читайте лучше не про 2pc, а про saga и компенсационные механизмы

Tarakanov-Oleg Автор вопроса
Anatoliy Burov
Читайте лучше не про 2pc, а про saga и компенсацио...

Хотели обойтись без этого😊 Спасибо за ответы

Tarakanov Oleg
Хотели обойтись без этого😊 Спасибо за ответы

Ну, как по мне, 2pc уже редко применяют в современной разработке.

Это поддержка распределённых менеджэров транзакцый (DTM). Чтобы после PREPARE ужэ точно (несмотря ни на какие ребуты серверов, параллельные запросы и прочие неприятности) можно было закоммитить эту транзакцыю. Ну, или откатить. DTM делает PREPARE на всех серверах, на которые влияет распределённая транзакцыя. Ну, или на всех кроме одного главного. Если хоть один не прошёл -- всем делается ROLLBACK. Если все прошли -- всем будет сделан COMMIT. Если пытаться это сделать просто с обычной транзакцыей -- то есть заметная вероятность, что у всех пройдёт, а у одного -- не пройдёт (есть блокировки, которые проверяются непосредственно при commit, есть отдельно вероятность, что с сервером что-то случится до commit -- так что обычная, не подготовленная, транзакцыя имеет право в последний момент откатиться).

А разработчику -- скажыте, что транзакцыи вобще-то должны быть короткими. И если нужно несколько сервисов к одной базе -- то можно, конечно, запихать их через какой-то один endpoint в одну транзакцыю. Есть дажэ что-то, с трудом подходящее под то, что он хочет ( https://www.postgresql.org/docs/current/functions-admin.html#FUNCTIONS-SNAPSHOT-SYNCHRONIZATION ). Но по-хорошэму -- не надо так делать. Собирайте логическую транзакцыю из набора физических. Введите данные от сервиса с пометкой "пока не закоммичено", потом, когда всё будет собрано -- обновите пометку (как например).

Часто. Примерно всегда для прозрачного мульти-мастер шардинга. Очень горячая тема (практически перегретая). Но это немного не та область, которую вы видите, да.

Tarakanov Oleg
Передал:-)

А месячная зп разраба не передалась всё ещё Илье😁😅

Tarakanov-Oleg Автор вопроса
Ilya Anfimov
Часто. Примерно всегда для прозрачного мульти-маст...

вполне возможно. я просто Java программист, у меня DB как прикладное идёт=) и мы сейчас распределённые системы разрабатываем без 2pc. Возможно где то и применяется 2pc, но у нас другие подходы к архитектуре)

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта