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

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

Firebird Transactions


negrila ©   (2004-06-27 19:13:00) 

Использую Firebird и IBDataSet, не понимаю, когда запускать и когда подтверждать транзакцию. Делаю при показе модальной формы с DBGrid IBTransaction.Active := true и IBTranasactioin.StartTransaction, IBDataSet1.Active := true , все работает и показывается, а вот когда делать IBTransaction.Commit? По закрытию формы? А если человек на два часа оставит окно открытым и уйдет? Не понимаю.


jack128   (2004-06-28 01:28:00) [1]

в принципе - если следовать логике - чтение в одной транзакции, запись в другой - то на всю программу может хватить всего ДВУХ компонентов IBTransaction, при этом приложение может быть очень навороченным.
Лично я на чтение использую одну транцакцию на приложение, а на запись на каждый DataModule/Форму - свою транзакцию.

> IBDataSet1.Active := true ,
> тут происходит не явное открытие транзакции. Но ИМХО отучать
> себя от такого стиля нужно.
>
> А как делать правильно?

ПРАВИЛЬНО и так и так. Но лично я предпочитаю явно открывать транзакцию. Такое вот у меня ИМХО ;-)

if not IbTrans.InTransaction then
 IbTrans.StartTransaction;
try
 MyDataSet.Open;
....
 MyDataSet.Close;
 IbTrans.Commit
except
 IbTrans.Rollback;
end;


DrPass   (2004-06-28 01:01:00) [2]


> для каждого датасета свою IBTransaction держать? Или можно
> одной обойтись

Нет, конечно. Зависит от логики программы - если требуется независимая работа с несколькими источниками данных, ты делаешь ее в разных транзакциях. Если не требуется, можно и одной обойтись.


negrila   (2004-06-28 00:54:00) [3]

IBDataSet1.Active := true ,
тут происходит не явное открытие транзакции. Но ИМХО отучать себя от такого стиля нужно.

А как делать правильно? И еще вдогонку вопрос: для каждого датасета свою IBTransaction держать? Или можно одной обойтись


Petr V. Abramov   (2004-06-27 20:07:00) [4]

> А если человек на два часа оставит окно открытым и уйдет?
 Если оставит транзакцию, которая не держит блокировок, пусть ходит сколько хочет. Отсюда вывод - блокирующие транзакции надо закрывать как можно быстрее.
 В 10% случаев это невозможно, тогда лечится только администртивными мерами.


jack128   (2004-06-27 19:46:00) [5]


> IBTransaction.Active := true и IBTranasactioin.StartTransaction
это одно и тоже

> IBDataSet1.Active := true ,
тут происходит не явное открытие транзакции. Но ИМХО отучать себя от такого стиля нужно.


> а вот когда делать IBTransaction.Commit? По закрытию формы?
> А если человек на два часа оставит окно открытым и уйдет?
>
можно закрыть по СommitRetaining, тогда курсор останется открытыл. А можно и оставить транзакцию на пару часов открытой - в IB чтение не блокурует пишущие транзакции. Лудше всего читать в одной IbTransaction, писать в другой, причем читающая должна иметь параметры read read_commited nowait - такая транзакция - самая ненапряжная для сервера.


Johnmen   (2004-06-27 19:39:00) [6]

Читающую тр-ию можешь оставлять активной сколь угодно долго.
А вот пишущая д.б. как можно короче...


Наверх

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