SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » isc_prepare_transaction() , isc_prepare_transaction2() (ту бы, или не ту бы)
isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3151] Thu, 21 September 2023 13:11 Переход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 800
Зарегистрирован: 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() [сообщение #3152 является ответом на сообщение #3151] Thu, 21 September 2023 14:14 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 314
Зарегистрирован: August 2022
Senior Member
МП
А вот если у меня на одном конце приложения один сервер, а на другом - совсем другой (а то и вообще не Firebird), то isc_prepare_transaction() таки нужен.

Я правильно понимаю?

зы: про EXTERNAL DATA SOURCE пока не будем.
Даже если серверы разные, но все участники распределённой тр-ции - Firebird, то isc_prepare_transaction() по-прежнему не обязательна.
Если есть не-Firebird участники, то без isc_prepare_transaction() - никак.
PS И ещё там была isc_reconnect_transaction()
Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3154 является ответом на сообщение #3152] Thu, 21 September 2023 15:46 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 800
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
hvlad
Даже если серверы разные, но все участники распределённой тр-ции - Firebird, то isc_prepare_transaction() по-прежнему не обязательна.
круто!
т.е. клиент по DB-хендлам просекает что сервера разные и колдует соответственно?

hvlad
Если есть не-Firebird участники, то без isc_prepare_transaction() - никак.
ну я примерно так и предполагал.

hvlad
PS И ещё там была 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 ?
Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3156 является ответом на сообщение #3154] Thu, 21 September 2023 17:31 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 800
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
кстати, обнаружил ещё и fb_disconnect_transaction().
тоже интересно.
Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3157 является ответом на сообщение #3154] Thu, 21 September 2023 22:44 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 314
Зарегистрирован: August 2022
Senior Member
МП
hvlad
Даже если серверы разные, но все участники распределённой тр-ции - Firebird, то isc_prepare_transaction() по-прежнему не обязательна.
круто!
т.е. клиент по DB-хендлам просекает что сервера разные и колдует соответственно?
Ему это не нужно.
Если логика приложения подразумевает, что все участники - серверы Firebird (Interbase), то, обычно, никаких
дополнительных телодвижений не нужно - достаточно isc_start_multiple() и isc_commit_transaction(). Никакого
специального "колдовства" нет, тем более ничего не зависит от того, что там за реальные серверы.

МП
hvlad
PS И ещё там была 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() [сообщение #3158 является ответом на сообщение #3156] Thu, 21 September 2023 23:01 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 314
Зарегистрирован: August 2022
Senior Member
МП писал(а) Thu, 21 September 2023 17:31
кстати, обнаружил ещё и fb_disconnect_transaction().
тоже интересно.
Это чисто клиентский вызов, позволяет "обнулить" тр-цию в памяти клиента без обращения к серверу.
Предназначен для возможности корректного дисконнекта в тех случаях, когда связь с сервером аварийно оборвана.
Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3159 является ответом на сообщение #3158] Fri, 22 September 2023 11:22 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 800
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
hvlad
МП
кстати, обнаружил ещё и fb_disconnect_transaction().
тоже интересно.
Это чисто клиентский вызов, позволяет "обнулить" тр-цию в памяти клиента без обращения к серверу.
Предназначен для возможности корректного дисконнекта в тех случаях, когда связь с сервером аварийно оборвана.
это чтоб при isc_detach_database не получить isc_open_trans?
или зачем?
Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3160 является ответом на сообщение #3157] Fri, 22 September 2023 12:18 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 800
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
hvlad
МП
.isc_reconnect_transaction()
что и как она делает?
Она позволяет получить клиентский хендл одного участника подготовленной
распределённой тр-ции, чтобы потом перевести его в финальное состояние вызовом commit или rollback.
Есс-но, после анализа состояний остальных участников.
Последняя пара пар-ров указывают на буфер с ID этого участника и размер буфера.
уточни пожалуйста, под ID подразумевается значение RDB$TRANSACTION_ID из таблицы RDB$TRANSACTIONS ?
Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3162 является ответом на сообщение #3160] Fri, 22 September 2023 13:33 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 314
Зарегистрирован: August 2022
Senior Member
МП
hvlad
МП
.isc_reconnect_transaction()
что и как она делает?
Она позволяет получить клиентский хендл одного участника подготовленной
распределённой тр-ции, чтобы потом перевести его в финальное состояние вызовом commit или rollback.
Есс-но, после анализа состояний остальных участников.
Последняя пара пар-ров указывают на буфер с ID этого участника и размер буфера.
уточни пожалуйста, под ID подразумевается значение RDB$TRANSACTION_ID из таблицы RDB$TRANSACTIONS ?
ID не обязан быть в RDB$TRANSACTIONS (это зависит от использования prepare/prepare2),
главное чтобы этот номер был в TIP в состоянии limbo.
Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3163 является ответом на сообщение #3159] Fri, 22 September 2023 13:35 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 314
Зарегистрирован: August 2022
Senior Member
МП
hvlad
МП
кстати, обнаружил ещё и fb_disconnect_transaction().
тоже интересно.
Это чисто клиентский вызов, позволяет "обнулить" тр-цию в памяти клиента без обращения к серверу.
Предназначен для возможности корректного дисконнекта в тех случаях, когда связь с сервером аварийно оборвана.
это чтоб при isc_detach_database не получить isc_open_trans?
или зачем?
Да, насколько я помню. Ну и чтобы detach не лез в сеть лишний раз.
Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3164 является ответом на сообщение #3162] Fri, 22 September 2023 13:57 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 800
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
hvlad
МП
уточни пожалуйста, под ID подразумевается значение RDB$TRANSACTION_ID из таблицы RDB$TRANSACTIONS ?
ID не обязан быть в RDB$TRANSACTIONS (это зависит от использования prepare/prepare2),
главное чтобы этот номер был в TIP в состоянии limbo.
я правильно понимаю, что если использовался prepare, а не prepare2, то в RDB$TRANSACTIONS никакого ID не будет.
тогда где его взять?
isc_database_info() с параметром isc_info_limbo?

Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3165 является ответом на сообщение #3164] Fri, 22 September 2023 14:14 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 314
Зарегистрирован: August 2022
Senior Member
МП
я правильно понимаю, что если использовался prepare, а не prepare2, то в RDB$TRANSACTIONS никакого ID не будет.
Не правильно.

Если ты создавал тр-цию, как распределённую (с несколькими участниками), то prepare для такой тр-ции создаст
стандартное описание и передаст его каждому участнику (через их prepare).

Если тебе не нужно стандартное описание (т.е. ты сам координируешь участников), то ты либо создаёшь своё,
и сам решаешь где и как его хранить, либо передаёшь его в prepare2.

МП
тогда где его взять?
Там, в куда ты его сохранил Smile
Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3166 является ответом на сообщение #3165] Fri, 22 September 2023 14:29 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 800
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
hvlad
МП
я правильно понимаю, что если использовался prepare, а не prepare2, то в RDB$TRANSACTIONS никакого ID не будет.
Не правильно.

Если ты создавал тр-цию, как распределённую (с несколькими участниками), то prepare для такой тр-ции создаст стандартное описание и передаст его каждому участнику (через их prepare).
непонимэ.
isc_prepare_transaction() мне нихрена кроме ISC_STATUS не вернёт.
где я возьму ID для isc_reconnect_transaction()?
Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3167 является ответом на сообщение #3166] Fri, 22 September 2023 15:09 Переход к предыдущему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 314
Зарегистрирован: 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()?
См. выше.

Ты вообще с какой целью это всё спрашиваешь ?
Предыдущая тема: coalesce() как реализована?
Следующая тема: Разрешает дубликаты алиасов CTE
Переход к форуму:
  


Текущее время: Sat Apr 27 19:21:19 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00958 секунд