Форум: "Базы";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
Внизтранзакции в IB (Firebird) Найти похожие ветки
← →
Olivka (2003-02-22 21:49) [0]Пользуюсь FIB для соединения с Firebird 1.0
Никак не получаются транзакции :(
Мне нужно закачать на сервер несколько таблиц - одна - как бы головная, и другие - зависимые. Начинаю транзакцию - прибиваю одну строку в головной таблице (по связям автоматически прибиваются зависимые строки в других таблицах), записываю новую строчку в головную таблицу - получаю ее ID - записываю строки в подчиненные таблицы (где ставлю ссылку на этот ID).
Потом, например, откатываю транзакцию - ничего не откатывается, все на месте!
В лог файле обращений в серверу есть моя транзакция, потом каждый SQL облачен в начало какой-то транзакции (вероятно это происходит автоматически ?) и комитт этой же транзакции (номера соотв-ют), в конце сделанный мною откат моей транзакции (номер тоже соответствует).
IBexpert видит все вставленные мною строки при трассировке программы сразу же (хотя, мне кажестся, если это не подтверждено еще - он их видеть не должен)
Откуда эти "не мои" транзакции я не пойму, ведь я нигде не ставила флагов автоматических транзакции ,а в описании написано, что все транзакции я должна начинать и заканчивать вручную. я так и делаю, но почему же не действует откат?
Редко прошу _ но если кто этим же занимается - пришлите кусочек кода. Те примеры, которые есть я просмотрела, но там все очень уж просто - try commit except rollback
и еще - может быть нельзя получить ID вставленной строки не подтвердив ее? (ID получаю генератором в триггере)
с уважением
← →
Olivka (2003-02-24 14:36) [1]я все мучаюсь, не получается никак, может кто все-таки знает?
← →
Alexandr (2003-02-24 14:42) [2]за примерами welcome сюда
www.fibplus.com.ua
А дело действительно в разных транзакциях... Как ты их называешь "левые".
Программа твоя? Значит и транзакции в этой программе тоже твои, а не какие-то левые.
← →
Olivka (2003-02-24 15:36) [3]Я просмотрела все свойства используемых компонент. Вроде не нашла ничего, что могло бы начать автоматически транзакцию. НАчинаю и заканчиваю я ее по разу. и только. Но даже если бы они были, то по правилам, ведь если внешняя транзакция откатывается - то и внутренние тоже должны откатиться, так, кажется. За ссылку спасибо, я там уже была, но посмотрю внимательнее
← →
DarkGreen (2003-02-25 05:06) [4]2 Olivka © (22.02.03 21:49)
Название используемой базы данных, а так же название используемой среды разработки не дает нам возможности узнать, какие компоненты ты ипользуешь, для доступа к IB/FB.
← →
Alexandr (2003-02-25 05:49) [5]какая внешняя... какая внутренняя...
Куда тебя понесло-то...
Что ты придумываешь?
← →
Olegon (2003-02-25 07:22) [6]2 Olivka
Начнем по порядку:
Стартует автоматически транзакция которая указана у тебя в свойстве DefaultTransaction компонента TpFIBDataBase. Стартовать автоматически транзакцию или нет, это устанавливается свойством используемого набора (например TpFIBDataSet.Options.poStartTransaction).
Соответственно эту транзакцию тебе и нужно подтверждать или откатывать.
Для внесения данных я использую отдельную транзакцию. Для этого в компоненте набора данных (например, TpFIBDataSet), есть такое свойство UpdateTransaction, где ты указываешь на отдельную транзакцию, которая будет использоваться при изменении данных.
Соответственно после внесения изменения тебе нужно будет подтверждать или откатывать эту транзакцию.
Теперь про получение ID только что вставленной записи. Советую попробывать следующие, я лично делаю так:
- убирай все свои триггеры, оставь только генераторы;
- теперь, в TpFIBDataSet есть свойство AutoUpdateOptions там и выставляй свойства: GeneratorName - имя твоего генератора для этого набора данных; KeyField - поле куда будет вставляться сгенирированное значение; UpdateTableName - имя таблицы; WhenGetGenID - когда получать сгенирированное значение (в твоем случае OnNewRecord).
Теперь как только ты начнешь добавлять новую записи, твой ID уже будет сгенирирован.
Примеров тут особо тоже других не дашь, все теже try ... comit except rollback. Но если что конкретное интересует, пиши.
Вот вроде бы и все... Постарался объяснить правильно. Если где был не точен - поправте меня :)
← →
Olivka (2003-02-25 10:30) [7]Приведу в пример лог(мои транзакции, которые я начинаю находятся в строчках 1 и 13
====================
1 10:44:02 FIBT_gtd: [Start transaction](145)
2 10:44:02 : [Start transaction](146)
3 10:44:02 : [Execute] DELETE FROM HEAD WHERE ...
Rows Affected: 0
Execute tick count 1
4 10:44:02 : [Commit (Hard commit)](146)
5 10:44:02 : [Start transaction](147)
6 10:44:02 : [Execute] INSERT INTO ... ...
7 10:44:02 ... ...
Rows Affected: 1
Execute tick count 1
8 10:44:02 : [Commit (Hard commit)](147)
9 10:44:02 : [Start transaction](148)
10 10:44:03 : [Fetch] SELECT ID_ FROM HEAD WHERE ...
11 10:44:03 : [Execute] SELECT ID_ FROM HEAD WHERE ..."
Execute tick count 1
12 10:44:03 : [Commit (Hard commit)](148)
13 10:44:06 FIBT_gtd: [Rollback](145)
← →
Alexandr (2003-02-25 10:32) [8]очень хороший лог.
← →
Olivka (2003-02-26 09:42) [9]Вот я и хочу узнать, откуда берутся другие транзакции
всего лишь
← →
Olivka (2003-02-26 09:46) [10]тем более, что последний Rollback не возвращает базу в первоначальное положение
← →
Desdechado (2003-02-26 14:18) [11]может, у тебя несколько соединений с БД? В одном стартуешь транзакцию явно, а в другом начинаешь модификации, вызывающие старт неявных транзакций на каждую команду.
Проверь, Dataset"ы к каким Database привязаны.
← →
Olivka (2003-02-26 15:15) [12]у меня всего один экземпляр того и другого.
Может это связано с тем, что добавлять записи нужно не с помощью SQL, а например методом insert датасета? и т.о. запросы SQL идут отдельно, а мои FIB транзакции - отдельно?
← →
Johnmen (2003-02-26 15:55) [13]Нет, дело не в этом...Все-таки где-то неявные тр-ии имеют место быть...
← →
Olivka (2003-02-26 22:36) [14]Такое впечатление, что все делают как-то по -другому, а я тут велосипед изобретаю :)
Ну пожалуйста - дайте примеееер
← →
Olivka (2003-02-27 09:33) [15]Сегодня все получилось. Оказалось, что запросы нужно выполнять только с помощью компонента tFIBquery.
2 Olegon
спасибо за совет. Мне он подошел, хотя и с небольшим изменением - я просто командой из FIB вызываю увеличенное на 1 значение генератора
Спасибо!
← →
Alexandr (2003-02-27 09:35) [16]2Olivka
> Сегодня все получилось. Оказалось, что запросы нужно выполнять
> только с помощью компонента tFIBquery.
а как же их еще выполнять?
← →
Olivka (2003-02-27 16:18) [17]2 Alexandr
Как ни странно это можно делать практически через все компоненты FIBplus (связанные с данной бд)(если вы не шутите)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c