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

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

вопрос по использованию pFIBTransaction в FIBPlus


KIR ©   (2003-04-30 09:51:00) 

Народ, нигде не могу найти инфу по следующему вопросу: для чего нужно свойство DefaultTransaction у компонента pFIBDataBase?


MsGuns   (2003-04-30 12:51:00) [1]

>koks © (30.04.03 12:42)
>снимай трусы,

С какой такой радости ?

Читаем внимательно:

>MsGuns © (30.04.03 12:34)
> Переход на ХП, "разруливание" инф.потоков (для этого и служит многотранзакционность) - это все от нас никуда не уйдет !


koks   (2003-04-30 12:42:00) [2]

снимай трусы,

все равно со временем ты перейдешь на то о чем я написал...


Johnmen   (2003-04-30 12:41:00) [3]

>koks © (30.04.03 12:36)

наливай ! :)


koks   (2003-04-30 12:36:00) [4]

ну....... за смысловую точность !! :))


MsGuns   (2003-04-30 12:34:00) [5]

>KIR © (30.04.03 09:51)

Возможно, будут топоптать ногами, но все же..

Если нет опыта (как у меня, к примеру), лучше итти от простого к сложному. Т.е. у меня ВСЕ ДЕЙСТВИЯ С БД выполняются в рамках одной транзакции. Если прогр.блок пишет в БД, то в конце всех шагов (может быть множество послед.запросов к разным таблам) ставлю транзакции CommitRetaining, если хоть один шаг не завершен (в защищенном блоке) нормально, то RollBackRetaining.
В первом случае (т.е.когда изменерия прошли успешно) переоткрываю все активные (т.е.у меня видимые в активных контролах) датасеты с позиционированием на предв. запомненную запись (использую для отображения только TIBQuery с параметрами или связанные). В результате все изменения (а у меня есть места, где меняются данные в 8 таблицах за раз) тут же видны во всех гридах, включая итоги.

Знаю, что это деревянно, но зато очень хорошо исследуется (ИМХО)механизм работы. Тем более, что в TIBDataSet или в том же FIBPlus`е наверняка внутри выполняется вся эта кухня. Загромождается код ? Безусловно ! Нагрузка на клиента ? Алгоритмически - да ! Зато след.проги будут писаться уже бОлее оптимально, а главное, с ПОНИМАНИЕМ. Переход на ХП, "разруливание" инф.потоков (для этого и служит многотранзакционность) - это все от нас никуда не уйдет !

Одеваю кожаные трусы ;)))


Johnmen   (2003-04-30 12:31:00) [6]

Это не придирка, а попытка призвать к смысловой точности в выражениях...:)


koks   (2003-04-30 12:20:00) [7]

ну вот только не надо придираться к словам...


Johnmen   (2003-04-30 12:16:00) [8]

>для каждого набора данных создавать отдельную транзакцию и управляеть ей ручками

Не создавать. А стартовать. :)


koks   (2003-04-30 12:09:00) [9]

Вообще хороший "тон" - для каждого набора данных создавать отдельную транзакцию и управляеть ей ручками... т.е. перед открытием стартовать а после закрытия подтверждать.. при ошибке соответственно откат... а DefaultTransaction можно вообще оставить пустым...
Насколько я понял изо всех доков лучше много коротких транзакций чем меньше но длинных... Это увеличивает надежность, снижает риск deadlock. Но это общее правило. FIBPlus пошел еще дальше - он предлагает "живой" датасет использовать в рамках не одной а двух транзакций - одна титающая и одна обновляющая чтобы сделать каждую из них еще короче....


Johnmen   (2003-04-30 11:34:00) [10]

Решается стандартно :
Заводится две (2) транзакции - одно для чтения, другая (как можно более короткая), для записи.


KIR   (2003-04-30 11:30:00) [11]

>Johnmen Молодэц тебе! :)

Немного поподробнее о моей ситуации: в принципе в проге вроде пока нет необходимости создавать ситуации, когда одна транзакция должна "видеть", что происходит внутри другой. Я подумал, почему бы не обойтись вообще одной транзакцией и бросил на форму один компонент pFIBTransaction и сделал ее DefaultTransaction для всей базы. Теперь получается, что все НД, ХП и Query выполняются в рамках этой транзакции.
Вот только один момент: допустим открыт НД (юзер его видит с помощью DBGrid"a). Затем происходит выполнение каких-то ХП (например вставка заголовка в мастер-талицу и наполнение детальной таблицы) все это происходит в блоке
TS.StartTransaction <-> TS.Commit.
Все нормально ХП выполнились без сбоев, но вот только поскольку произошел Commit, а у НД, который видит юзер та же транзакция, то он (НД) закрывается...

Народ, как это решается: толи в настройках транзакции надо что-то настроить, толи делать на все НД отдельную транзакцию, на ХП отдельную, на Query одтельную?


Johnmen   (2003-04-30 10:06:00) [12]

Для указания транзакции по умолчанию...:)


Наверх

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