Форум: "Базы";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.034 c