Начало » Использование СУБД » Firebird, HQbird, InterBase » isc_prepare_transaction() , isc_prepare_transaction2() (ту бы, или не ту бы)
isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3151] |
Thu, 21 September 2023 13:11 |
МП
Сообщений: 887 Зарегистрирован: August 2022 Географическое положение: бурятский тун...
|
Senior Member |
|
|
Здравствуйте ВСЕ!
В очередной раз перетрахивая код и отделяя мух от котлет, решил разнести ординарные транзакции и 2PC-транзакции по разным классам. В процессе возник вопрос.
В Бормадовском IBX транзакции всегда стартуются как multiple и коммитятся сразу по isc_commit_transaction() невзирая на то, сколько баз задействовано.
В принципе работает, да и хер с ним. isc_commit_transaction() сам все две фазы провернёт.
Но это в том случае, если не лезть в гетерогенные среды.
А вот если у меня на одном конце приложения один сервер, а на другом - совсем другой (а то и вообще не Firebird), то isc_prepare_transaction() таки нужен.
Я правильно понимаю?
зы: про EXTERNAL DATA SOURCE пока не будем.
|
|
|
|
|
|
Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3157 является ответом на сообщение #3154] |
Thu, 21 September 2023 22:44 |
hvlad
Сообщений: 357 Зарегистрирован: August 2022
|
Senior Member |
|
|
МПhvladДаже если серверы разные, но все участники распределённой тр-ции - Firebird, то isc_prepare_transaction() по-прежнему не обязательна.
круто!
т.е. клиент по DB-хендлам просекает что сервера разные и колдует соответственно? Ему это не нужно.
Если логика приложения подразумевает, что все участники - серверы Firebird (Interbase), то, обычно, никаких
дополнительных телодвижений не нужно - достаточно isc_start_multiple() и isc_commit_transaction(). Никакого
специального "колдовства" нет, тем более ничего не зависит от того, что там за реальные серверы.
МПhvladPS И ещё там была isc_reconnect_transaction()
о-па!
в хидере её вижу, а в API Guide описалова нет (и на Дебаркадере в доке к IB-2020 нет).
у меня она задекларирована так:
Tisc_reconnect_transaction = function(status_vector: PISC_STATUS;
db_handle: PISC_DB_HANDLE;
tran_handle: PISC_TR_HANDLE;
isc_arg4: Short;
isc_arg5: PChar): ISC_STATUS;
stdcall;
что и как она делает?
зы: подозреваю что isc_arg4 и isc_arg5 для записи в RDB$TRANSACTION_DESCRIPTION ? Она позволяет получить клиентский хендл одного участника подготовленной
распределённой тр-ции, чтобы потом перевести его в финальное состояние вызовом commit или rollback.
Есс-но, после анализа состояний остальных участников.
Последняя пара пар-ров указывают на буфер с ID этого участника и размер буфера.
Т.е. тот, кто вызывает isc_reconnect_transaction() должен хорошо понимать, что он делает.
На практике этим занимается gfix.
|
|
|
|
|
|
|
|
|
Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3165 является ответом на сообщение #3164] |
Fri, 22 September 2023 14:14 |
hvlad
Сообщений: 357 Зарегистрирован: August 2022
|
Senior Member |
|
|
МПя правильно понимаю, что если использовался prepare, а не prepare2, то в RDB$TRANSACTIONS никакого ID не будет. Не правильно.
Если ты создавал тр-цию, как распределённую (с несколькими участниками), то prepare для такой тр-ции создаст
стандартное описание и передаст его каждому участнику (через их prepare).
Если тебе не нужно стандартное описание (т.е. ты сам координируешь участников), то ты либо создаёшь своё,
и сам решаешь где и как его хранить, либо передаёшь его в prepare2.
МПтогда где его взять? Там, в куда ты его сохранил
|
|
|
|
Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3167 является ответом на сообщение #3166] |
Fri, 22 September 2023 15:09 |
hvlad
Сообщений: 357 Зарегистрирован: August 2022
|
Senior Member |
|
|
МПhvladМПя правильно понимаю, что если использовался prepare, а не prepare2, то в RDB$TRANSACTIONS никакого ID не будет. Не правильно.
Если ты создавал тр-цию, как распределённую (с несколькими участниками), то prepare для такой тр-ции создаст стандартное описание и передаст его каждому участнику (через их prepare). непонимэ.
isc_prepare_transaction() мне нихрена кроме ISC_STATUS не вернёт. А кто и где говорил, что он тебе вернёт что-то ещё ?
Если ты сам себе координатор, то сам узнавай нужную тебе для восстановления инф-цию ДО того как вызовешь
prepare и сам же храни её где и как хочешь.
Если же ты пользуешься координатором из fbclient, то тебе не нужно вызывать isc_reconnect_transaction, это
сделает gfix, когда ты его попросишь.
Как я уже говорил, стандартный координатор создаёт описание распределённой тр-ции и передаёт его каждому
участнику. Каждый участник сохраняет его в своей БД в rdb$transactions. gfix потом читает это описание,
извлекает из него нужные данные, соединяется с каждой тр-цией каждого участника (где возможно) и пытается
завершить распределённой тр-цию.
Код gfix открыт для изучения, ты же не хочешь чтобы я ещё и его тут так подробно комментировал ?
МПгде я возьму ID для isc_reconnect_transaction()? См. выше.
Ты вообще с какой целью это всё спрашиваешь ?
|
|
|
Переход к форуму:
Текущее время: Thu Nov 21 20:57:34 GMT+3 2024
Общее время, затраченное на создание страницы: 0.00981 секунд
|