Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-1181798062
Megabyte
2007-06-14 09:14
2007.10.21
Внесение изменений метаданных в зеркальную БД


2-1190951690
zzzz
2007-09-28 07:54
2007.10.21
Компонент DbEdit, узнать код клавиши разделителя


1-1186312251
fd979
2007-08-05 15:10
2007.10.21
ТЕlSideBar


3-1181792140
Klopan
2007-06-14 07:35
2007.10.21
Текстовые поля


2-1190903883
F@T@L_Err0r
2007-09-27 18:38
2007.10.21
пуск +D





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский