Перевожу MSVC-приложение на FireBird при помощи евойного C API. Изначально программа писалась под SQLite с его дефолтным механизмом autocommit:
— Если серия запросов выполняется внутри транзакции (begin transaction;...;commit, то эта серия выполняется как единая транзакция
— Если запрос либо серия запросов выполняется без указания транзакции, то SQLite создает под него транзакцию самостоятельно.
Очень хотелось бы организовать подобное и на FB: Сишный код с расчетом на вышеуказанное уже написан и переделывать его ВЕСЬ не хочется. С другой стороны, я не вижу, как в C API вообще в принципе можно работать в таком режиме: ф-ции C API isc_dsql_prepare и isc_dsql_execute требуют параметра "хэндл транзакции" и не похоже, чтобы туда можно было передать NULL.
Вопросы:
— Есть ли в FB режим автокоммита? Если да, то как его включить?
— Если нет, то как — без глобального переписывания сишного кода — можно обойти это ограничение?
Здравствуйте, <Аноним>, Вы писали:
А>- Есть ли в FB режим автокоммита? Если да, то как его включить?
Насколько я помню, нет. Точнее, он есть, но это все равно — транзакция. И хэндл оной нужно передавать серверу явно. Можно на одно соедиение повесить транзакцию по умолчанию. Но это неправильно. Логичнее каждое двействие предварять стартом отдельной транзакции.
А>- Если нет, то как — без глобального переписывания сишного кода — можно обойти это ограничение?
Никак. Потому что FB — это полноценный сервер БД, а SQLite — недосервер. Хочется подробнее — ступайте на http://www.ibase.ru и читайте. Там море документации.
Здравствуйте, LuciferArh, Вы писали:
А>>- Если нет, то как — без глобального переписывания сишного кода — можно обойти это ограничение?
LA>Никак. Потому что FB — это полноценный сервер БД, а SQLite — недосервер.
Чудечная логика. В таком случае, Microsoft SQL Server — тоже недосервер, т.к. у него autocommit тоже имеется.
Здравствуйте, Lloyd, Вы писали:
L>Чудечная логика. В таком случае, Microsoft SQL Server — тоже недосервер, т.к. у него autocommit тоже имеется.
Неверная логика. Ибо FB умеет как embedded, так и полноценно работать. (Microsoft, кстати, embedded умеет?) SQLite же в полноформатном режиме... Молчу, молчу... (с)
Здравствуйте, LuciferArh, Вы писали:
L>>Чудечная логика. В таком случае, Microsoft SQL Server — тоже недосервер, т.к. у него autocommit тоже имеется.
LA>Неверная логика. Ибо FB умеет как embedded, так и полноценно работать. (Microsoft, кстати, embedded умеет?) SQLite же в полноформатном режиме... Молчу, молчу... (с)
У вас какой-то сумбур в голове. Нет никакой связи между наличием автокоммита и умением работать в embedded-режиме, совсем никакой связи.
Здравствуйте, Аноним, Вы писали:
А>Вопросы: А>- Есть ли в FB режим автокоммита? Если да, то как его включить?
Нету. Никак. Все транзакции в FB стартуются и коммитятся явно, с клиента.
А>- Если нет, то как — без глобального переписывания сишного кода — можно обойти это ограничение?
Вы бы чтоль пример вашего кода привели, чтоб понятнее стало, с чем реально вы имеете дело. Сильно сомнительно, что API дергается из бизнес-логики явно, наверняка у вас для него уже создана какая-нибудь обертка. Если так — то в нее работу с транзакциями и встроить, нет?
Ку...
Re[2]: [FireBird] Как бороться с транзакциями?
От:
Аноним
Дата:
19.01.11 10:57
Оценка:
Здравствуйте, Пацак, Вы писали:
А>>- Если нет, то как — без глобального переписывания сишного кода — можно обойти это ограничение?
П>Вы бы чтоль пример вашего кода привели, чтоб понятнее стало, с чем реально вы имеете дело. Сильно сомнительно, что API дергается из бизнес-логики явно, наверняка у вас для него уже создана какая-нибудь обертка. Если так — то в нее работу с транзакциями и встроить, нет?
Да, конечно, какая-то обертка есть, и в нее пришлось встроить явную работу с неявными транзакциями Т.е. проблема решена, но без удовольствия