kdv писал(а):2.
и потом надо ли вообще активизировать транзакцию для записи Tr_Write сразу после коннекта к БД или просто делать
StartTransaction по мере необходимости?
в фибплюсах, если я правильно помню, update transaction по умолчанию стартует само, где быстро выполняется оператор изменения, и тут же вызывается commitretaining. который опциями надо заменить на commit. После чего можно updatetransaction вообще не трогать.
Давайте разберем этот момент.
В TpFIBDataSet две транзакции:
1) Постоянно открытая читающая (Transaction).
2) Короткая ("быстрая") пишущая (UpdateTransaction).
Существует две настройки для управления стартом и подтверждением транзакций.
1. Опция poStartTransaction (в Options). Используется для читающей и пишущей транзакций. Предназначена для автозапуска (при необходимости) транзакции, если до того она была неактивна.
Пример: Transaction неактивна. Набор закрыт.
Вызываем pFIBDataSet.Open.
При poStartTransaction автоматически выполнится Transaction.StartTransaction и набор откроется, иначе будет возбуждено исключение о неактивной транзакции.
Пример: вызван оператор pFIBDataSet.Post. Так как изменения происходят в контексте пишущей транзакции, то она должна быть активна. При poStartTransaction UpdateTransaction будет автоматически запущена. При выключенной опции ее надо вручную стартовать.
2. Свойство AutoCommit. Относится только к UpdateTransaction. Эта транзакция может быть любой, в том числе и ReadOnly
. В последнем случае вы просто не сможете подтверждить изменения и будут возбуждаться соответствующие исключения.
Это свойство предназначено для автоматического вызова UpdateTransaction.Commit (не CommitRetaining) после каждого Post и Delete.
Есть еще одно свойство - RefreshTransaction, которое принимает два значения: tkReadTransaction и tkUpdateTransaction. Оно указывает, в какой транзакции делать обновления записи. Для чего это надо: допустим, вы работаете со справочником, в котором изменения подтверждаются только после нажатия кнопки "Сохранить". При tkReadTransaction после refresh'а записи получаешь версию записи до изменения (изменения "исчезнут"), а при tkUpdateTransaction - измененную.
Таким образом, при poStartTransaction и AutoCommit (а также при правильных настройках транзакций) получаем автоматически срабатывающий механизм обновления записей, который может работать бесконечно долго без ущерба для производительности.
P.S. Читающая транзакция обычно одна на все датасеты и стартует сразу же после подключения к базе, коммитясь при выходе из приложения.