Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.18;
Скачать: CL | DM;

Вниз

Firebird Transactions   Найти похожие ветки 

 
negrila   (2004-06-27 19:13) [0]

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


 
Johnmen ©   (2004-06-27 19:39) [1]

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


 
jack128 ©   (2004-06-27 19:46) [2]


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

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


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


 
Petr V. Abramov ©   (2004-06-27 20:07) [3]

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


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

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

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


 
DrPass ©   (2004-06-28 01:01) [5]


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

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


 
jack128 ©   (2004-06-28 01:28) [6]

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

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

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

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



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

Текущий архив: 2004.07.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.034 c
14-1088605559
IceBeerg
2004-06-30 18:25
2004.07.18
Помогите найти программу


4-1086269173
anbezr
2004-06-03 17:26
2004.07.18
описания функций и типов SetupApi напр SetupDiEnumDeviceInterface


1-1088752686
Mc'SIMM
2004-07-02 11:18
2004.07.18
Моргание в панели задач


1-1089009206
officeman
2004-07-05 10:33
2004.07.18
Про СТРОКУ с разделителями


14-1088434288
nick-from
2004-06-28 18:51
2004.07.18
Владельцам КПК (Москва)