Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

Транзакции в Interbase   Найти похожие ветки 

 
suharew   (2005-09-18 20:45) [0]

Добрый вечер.  У меня в проекте около 30 форм. и около 20 таблиц. Почти на каждой форме таблица. Использую TIBQuery для выбора записи. На главной форме TIBDataBase и TIBTransaction. Получается что все IBQuery используют одну базу и один IBTransaction. Так пойдет или каждому Query по IBTransaction. Просто получается на одной форме данные читаются на другой редактируются. Читал про транзакции там упоминается про параметры read, write. подскажите как организовать по лучше все это.
Сейчас некоторые запросы выполняются по таймеру. По моему получается какое-то пересечение транзакций. Наверное следует использовать много IBTransaction. Я новичок в использовании Interbase раньше работал с БДЕ. Подскажите.

И как в коде программы делать выборку или запись в базу.
Ну я имею ввиду использование транзакций.
Я делаю так.

   try

     If form1.IBTransaction1.InTransaction then
     begin
         ..................      
       form2.IBQuery1.ExecSQL;
       form1.IBTransaction1.CommitRetaining;
     end;

   except
       if form1.IBTransaction1.Active then form1.IBTransaction1.RollbackRetaining;



 
Sergey_Masloff   (2005-09-18 20:53) [1]

В принципе, для 80% приложений сойдет 1 транзакция на все.
Еще для 19.999% достаточно двух - одна читающая другая пишущая.

В любом случае после селекта коммит ретайнинг излишество.

Так что совет такой:
1) Попробуй с 1 транзакцией
2) Если все же это не устроит сделай так:
 первая транзакция только читающая. На ней будут висеть все датасеты. Она может быть открыта постоянно  - никаких коммитов и роллбеков не надо.
 вторая транзакция пишущая. Для обновлений не используй встроеных средств IBDataSet а организуй свою обработку и пиши в базу через отдельный компонент TIBSQL подвязаный к пишущей транзакции. И там - через try - except то есть делаешь быстро: открываешь транзакцию выполняешь команду (удаление запись или изменение) коммитишь если ошибка откатываешь но транзакцию закрываешь в любом случае. При успешном изменении ДатаСет данные которого ты обновлял нужно переоткрыть.


 
DrPass ©   (2005-09-18 22:19) [2]


> В любом случае после селекта коммит ретайнинг излишество

Его вообще не стоит делать в транзакциях, которые открыты долгое время. В конце-концов потребление ресурсов сервера Interbase может возрасти до совершенно неудобоваримого уровня.
В большинстве случаев оптимальный вариант - две транзакции. Одна с параметром read+read commited, к ней подключены отображающие датасеты. Ее можно без всяких коммитов держать открытой сколь угодно долго. Вторая используется для операций вставки/удаления/изменения. Открывается непосредственно перед операцией и после операции завершается коммитом или откатом.
Одна транзакция нехороша тем, что после коммита приходится переоткрывать источники данных.


 
Sergey_Masloff   (2005-09-18 22:36) [3]

>В конце-концов потребление ресурсов сервера Interbase может возрасти >до совершенно неудобоваримого уровня
Это уже да-а-а-вным давно вылечили. Не говорю что это нужно делать но если и делать ничего страшного не будет.


 
Os   (2005-09-19 17:07) [4]

Там есть еще транзакции по таймеру.
Что будет если два потока вызовут

WriteTransaction.StartTransaction;

На таймеры нужны свои компоненты?


 
Tonich ©   (2005-09-19 17:27) [5]

http://www.ibase.ru/devinfo/ibx.htm - тоже есть что-то по этому поводу



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.057 c
14-1128783936
Piter
2005-10-08 19:05
2005.10.30
Сборная России - сборная Люксембурга


14-1128009414
Kerk
2005-09-29 19:56
2005.10.30
9 признаков американца (наверно баян)


2-1128851876
ArtemESC
2005-10-09 13:57
2005.10.30
Ascii => DWord


8-1118178605
Серёга
2005-06-08 01:10
2005.10.30
Работа с TImage


6-1121239399
kot andrei
2005-07-13 11:23
2005.10.30
запрос пароля





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский