Форум: "Базы";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
ВнизТранзакции в InterBase Найти похожие ветки
← →
Lavrenty © (2007-06-14 23:59) [0]Здравствуйте Мастера! Отлаживаю программу и не пойму в какой момент она глючит. Возникло подозрение, что неправильно работаю с транзакциями. Подскажите пожалуйста, правильно ли я сделал? Это упрощённая структура программы.
procedure main_A;
begin
IBTransA.StartTransaction;
Edit_A;
Insert_A;
IBTransA.Commit;
end;
procedure Edit_A;
begin
IBQueryA.Open;
-- здесь идет апдейт IBQueryA
IBQueryA.Post;
IBQueryA.Close;
end;
procedure Insert_A;
begin
IBQueryA.Open;
-- здесь вставка новой записи в IBQueryA
IBQueryA.Post;
IBQueryA.Close;
end;
Может надо в каждой процедуре Edit_A и Insert_A стартовать и коммитить транзакцию?
← →
MsGuns © (2007-06-15 00:47) [1]"Одна транзакция читает, другая - пишет, после чего читающий запрос поереоткрывается" - это самый надежный и проверенный способ "синхранной" работы с транзакциями в ИБ.
Можно, конечно, использовать правку непосредственно самим классом TIBDataSet, но в этом случае перечитка отображаемого НД делается неявно.
Рекомендую для лучшего понимания механизма транзакций книгу Вострикова и Ковязина "Мир интербэйз"
← →
atruhin © (2007-06-15 06:29) [2]> "Одна транзакция читает, другая - пишет, после чего читающий
> запрос поереоткрывается"
Это зачем так то? Если в компонентах есть поддержка рефреша одной записи.
Ваш вариант подходит только для массовых изменений.
← →
atruhin © (2007-06-15 06:34) [3]Автору:
> Может надо в каждой процедуре Edit_A и Insert_A стартовать
> и коммитить транзакцию?
Это зависит только от бизнес логики программы, т.е. какой блок операторов нужно откатить в случае ошибки.
IBQueryA.Close; - вот здесь может в дальнейшем быть проблемма, лучше если используешь 1 Query для разных операций
в начале процедуры проверять: if IBQueryA.Open then IBQueryA.Close;
← →
Johnmen © (2007-06-15 09:13) [4]Для того, чтобы вставить новую запись, вовсе не надо, и даже вредно, тянуть на клиента что-либо. То же самое касаемо и апдейта. Ес-но в разрезе сабжа...
← →
keymaster © (2007-06-15 11:09) [5]
> MsGuns © (15.06.07 00:47) [1]
> Рекомендую для лучшего понимания механизма транзакций книгу
> Вострикова и Ковязина "Мир интербэйз"
Книжке - респект.
Оч хорошо написано.
И ещё есть замечательная вещь для работы с IB/FB - IBPlus.
> atruhin © (15.06.07 06:34) [3]
if IBQueryA.
> Open then IBQueryA.Close;
Гораздо лучше - if IBQueryA.Active then IBQueryA.Close;
← →
Johnmen © (2007-06-15 11:20) [6]Гораздо лучше - просто IBQueryA.Close;
← →
keymaster © (2007-06-15 11:21) [7]
> Гораздо лучше - просто IBQueryA.Close;
Есть риск получить что операция невыполнима для Closed dataset
← →
Johnmen © (2007-06-15 11:46) [8]Риска нет. По определению :)
← →
keymaster © (2007-06-15 12:10) [9]=)
← →
atruhin © (2007-06-15 13:08) [10]> Гораздо лучше - if IBQueryA.Active then IBQueryA.Close;
Ну да, наверное. Просто с FIB работаю, а там как я и написал.
> Риска нет. По определению :)
Т.е. не понял? Я имел ввиду, что когда разные процедуры используют 1 Query,
рано или поздно поменяется порядок вызова, какая то процедура может вызвать
исключение и оставить набор открытым.
← →
keymaster © (2007-06-15 13:20) [11]
> Т.е. не понял?
Суть не совсем в этом.
Если надо закрыть запрос в случае, если он открыт - то
лучше использовать Active а не Open.
← →
Johnmen © (2007-06-15 13:30) [12]
> Если надо закрыть запрос в случае, если он открыт - толучше
> использовать Active а не Open.
А это вообще ерунда, ибо Active это свойство, а Open это метод.
Но у FIBQuery (или что там, не помню...) Open не метод, а свойство.
Т.о. "лучше" - "хуже" неприменимо.
Но лучше [6].
← →
pavel_guzhanov © (2007-06-15 13:49) [13]непонятно, в чем заключается глюк.
Но сразу можно посоветовать для update и insert использовать не IBQuery.Open, а IBQuery.ExecSQL .
И проверь, у тебя оба Query связаны с IBTransA?
← →
keymaster © (2007-06-15 13:53) [14]
А это вообще ерунда, ибо Active это свойство, а Open это метод.
Ну-ну...
Каждый раз для проверки переоткрывать запрос...
Впрочем, со всеми бывает...
> Но у FIBQuery (или что там, не помню...) Open не метод,
> а свойство.
Это только у FIBQuery.
А у IBQuery - Open - метод.
← →
Johnmen © (2007-06-15 14:00) [15]
> keymaster © (15.06.07 13:53) [14]
Ты вообще посты читаешь? А если читаешь, то вникаешь? Или ты тоже писатель?
← →
keymaster © (2007-06-15 14:09) [16]
> Johnmen © (15.06.07 14:00) [15]
> > keymaster © (15.06.07 13:53) [14]Ты вообще посты читаешь?
> А если читаешь, то вникаешь? Или ты тоже писатель?
Сообщите номера постов для вдумчивого перечитывания и сообщите на что обратить пристальное внимание.
← →
atruhin © (2007-06-15 14:22) [17]> [16] keymaster © (15.06.07 14:09)
1.
> Каждый раз для проверки переоткрывать запрос...
Ни кто не предлагает для проверки преоткрывать запрос. Переоткрыть нужно автору,
может он где то текст меняет, или что то еще.
Свойство IBQuery.Active всего лишь вызывает методы: Open или Close
2.
> Это только у FIBQuery. А у IBQuery - Open - метод.
То что я ошибся с IBQuery я уже написал, чего мусолить то?
У TpFIBQuery свойства Active нет в приципе, Open - функция возвращающая статус.
Все это написано в предыдущих постах. О чем сприм?
← →
Johnmen © (2007-06-15 14:38) [18]
> То что я ошибся с IBQuery я уже написал, чего мусолить то?
Это ты у кеймастера спрашивай.
← →
keymaster © (2007-06-15 14:44) [19]
> У TpFIBQuery свойства Active нет в приципе, Open - функция
> возвращающая статус.
Да, тут я че-то с FIBDataSet спутал.
← →
MsGuns © (2007-06-15 15:30) [20]>pavel_guzhanov © (15.06.07 13:49) [13]
>Но сразу можно посоветовать для update и insert использовать не IBQuery.Open, а IBQuery.ExecSQL .
>И проверь, у тебя оба Query связаны с IBTransA?
Категорически не советую включать в одну транзакцию читающие ДЛЯ ОТОБРАЖЕНИЯ и изменяющие запросы. Это может приводить к весьма интересным последствиям.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.05 c