Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Транзакции в InterBase [D7, IB7]


Lavrenty ©   (2007-06-14 23:59:00) 

Здравствуйте Мастера! Отлаживаю программу и не пойму в какой момент она глючит. Возникло подозрение, что неправильно работаю с транзакциями. Подскажите пожалуйста, правильно ли я сделал? Это упрощённая структура программы.

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 15:30:00) [1]

>pavel_guzhanov ©   (15.06.07 13:49) [13]
>Но сразу можно посоветовать для update и insert использовать не IBQuery.Open, а IBQuery.ExecSQL .
>И проверь, у тебя оба Query связаны с IBTransA?

Категорически не советую включать в одну транзакцию читающие ДЛЯ ОТОБРАЖЕНИЯ и изменяющие запросы. Это может приводить к весьма интересным последствиям.


keymaster   (2007-06-15 14:44:00) [2]


> У TpFIBQuery свойства Active нет в приципе, Open - функция
> возвращающая статус.

Да, тут я че-то с  FIBDataSet спутал.


Johnmen   (2007-06-15 14:38:00) [3]


> То что я ошибся с IBQuery я уже написал, чего мусолить то?

Это ты у кеймастера спрашивай.


atruhin   (2007-06-15 14:22:00) [4]

> [16] keymaster ©   (15.06.07 14:09)

1.
> Каждый раз для проверки переоткрывать запрос...

Ни кто не предлагает для проверки преоткрывать запрос. Переоткрыть нужно автору,
может он где то текст меняет, или что то еще.
Свойство IBQuery.Active всего лишь вызывает методы: Open или Close
2.
> Это только у FIBQuery. А у IBQuery - Open - метод.

То что я ошибся с IBQuery я уже написал, чего мусолить то?
У TpFIBQuery свойства Active нет в приципе, Open - функция возвращающая статус.

Все это написано в предыдущих постах. О чем сприм?


keymaster   (2007-06-15 14:09:00) [5]


> Johnmen ©   (15.06.07 14:00) [15]
> > keymaster ©   (15.06.07 13:53) [14]Ты вообще посты читаешь?
>  А если читаешь, то вникаешь? Или ты тоже писатель?

Сообщите номера постов для вдумчивого перечитывания и сообщите на что обратить пристальное внимание.


Johnmen   (2007-06-15 14:00:00) [6]


> keymaster ©   (15.06.07 13:53) [14]

Ты вообще посты читаешь? А если читаешь, то вникаешь? Или ты тоже писатель?


keymaster   (2007-06-15 13:53:00) [7]


А это вообще ерунда, ибо Active это свойство, а Open это метод.

Ну-ну...
Каждый раз для проверки переоткрывать запрос...
Впрочем, со всеми бывает...


> Но у FIBQuery (или что там, не помню...) Open не метод,
> а свойство.

Это только у FIBQuery.
А у IBQuery - Open - метод.


pavel_guzhanov   (2007-06-15 13:49:00) [8]

непонятно, в чем заключается глюк.

Но сразу можно посоветовать для update и insert использовать не IBQuery.Open, а IBQuery.ExecSQL .

И проверь, у тебя оба Query связаны с IBTransA?


Johnmen   (2007-06-15 13:30:00) [9]


> Если надо закрыть запрос в случае, если он открыт - толучше
> использовать Active а не Open.

А это вообще ерунда, ибо Active это свойство, а Open это метод.
Но у FIBQuery (или что там, не помню...) Open не метод, а свойство.

Т.о. "лучше" - "хуже" неприменимо.
Но лучше [6].


keymaster   (2007-06-15 13:20:00) [10]


> Т.е. не понял?

Суть не совсем в этом.
Если надо закрыть запрос в случае, если он открыт - то
лучше использовать Active а не Open.


atruhin   (2007-06-15 13:08:00) [11]

> Гораздо лучше - if IBQueryA.Active then IBQueryA.Close;

Ну да, наверное. Просто с FIB работаю, а там как я и написал.
> Риска нет. По определению :)

Т.е. не понял? Я имел ввиду, что когда разные процедуры используют 1 Query,
рано или поздно поменяется порядок вызова, какая то процедура может вызвать
исключение и оставить набор открытым.


keymaster   (2007-06-15 12:10:00) [12]

=)


Johnmen   (2007-06-15 11:46:00) [13]

Риска нет. По определению :)


keymaster   (2007-06-15 11:21:00) [14]


> Гораздо лучше - просто IBQueryA.Close;

Есть риск получить что операция невыполнима для Closed dataset


Johnmen   (2007-06-15 11:20:00) [15]

Гораздо лучше - просто IBQueryA.Close;


keymaster   (2007-06-15 11:09:00) [16]


> 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 09:13:00) [17]

Для того, чтобы вставить новую запись, вовсе не надо, и даже вредно, тянуть на клиента что-либо. То же самое касаемо и апдейта. Ес-но в разрезе сабжа...


atruhin   (2007-06-15 06:34:00) [18]

Автору:

> Может надо в каждой процедуре Edit_A и Insert_A стартовать
> и коммитить транзакцию?

Это зависит только от бизнес логики программы, т.е. какой блок операторов нужно откатить в случае ошибки.
IBQueryA.Close; - вот здесь может в дальнейшем быть проблемма, лучше если используешь 1 Query для разных операций
в начале процедуры проверять: if IBQueryA.Open then IBQueryA.Close;


atruhin   (2007-06-15 06:29:00) [19]

> "Одна транзакция читает, другая - пишет, после чего читающий
> запрос поереоткрывается"

Это зачем так то? Если в компонентах есть поддержка рефреша одной записи.
Ваш вариант подходит только для массовых изменений.


MsGuns   (2007-06-15 00:47:00) [20]

"Одна транзакция читает, другая - пишет, после чего читающий запрос поереоткрывается" - это самый надежный и проверенный способ "синхранной" работы с транзакциями в ИБ.
Можно, конечно, использовать правку непосредственно самим классом TIBDataSet, но в этом случае перечитка отображаемого НД делается неявно.

Рекомендую для лучшего понимания механизма транзакций книгу Вострикова и Ковязина "Мир интербэйз"


Наверх

Титульная страница Поиск, карта сайта Написать письмо