Использую FIBDataSet для доступа к одной таблице. С DataSet-ом связан Grid. Использую раздельные транзакции для чтения и записи. В статье об IBX http://www.ibase.ru/devinfo/ibx.htm было указано про особенность указанного компонента, которая выражается в следующем: после записи вызывается CommitRetaining, и транзакция фактически остается открытой. Для решения проблемы предлагается выставить в TimeOutAction - TACommit.
Теперь расскажу как это всё работает у меня (логи SQLMonitor). Для общности приведу несколько вариантов:
1) [Timeout=1; TimeoutAction=TACommit; AutoCommit=false;]
FIBWriteTrans: [Start transaction](3649)
FIBQtimers.UpdateQuery: [Execute] UPDATE REMS ...
FIBQtimers.RefreshQuery: [Execute] ...
FIBWriteTrans: [Commit (Hard commit)](0) ...
Плохо. Refresh делается перед Commit и грид отображает неактуальную информацию.
2) [Timeout=1; TimeoutAction=TACommit; AutoCommit=true;]
FIBWriteTrans: [Start transaction](3660)
FIBQtimers.UpdateQuery: [Execute] UPDATE REMS ...
FIBWriteTrans: [Commit (Hard commit)](0) ...
FIBQtimers.RefreshQuery: [Execute] ...
Всё хорошо, но в хелпе на FIBplus прочитал, что при AutoCommit вызывается CommitRetaining, а тут Commit. Непонятки...
3) [Timeout=0; TimeoutAction=TARollBack; AutoCommit=true;]
FIBWriteTrans: [Start transaction](3666)
FIBQtimers.UpdateQuery: [Execute] UPDATE REMS ...
FIBWriteTrans: [Commit (Hard commit)](0) ...
FIBQtimers.RefreshQuery: [Execute] ...
Короче также как и в предыдущем случае, всё хорошо, работает правильно. Но как же быть со сведениями из вышеуказанной статьи?
Моя версия: авторы FIBplus поменяли соответствующим образом код своих компонентов, а в хелпе забыли исправить?
Непонятки с FIBDataSet (использование раздельных транзакций)
Модератор: kdv
не знаю. эта тема обсуждалась на sql.ru в момент написания статьи с разработчиком FIBPLus. Вроде бы тогда был FIBPlus 6.25. Какой он у тебя версии - я понятия не имею. Знаю что Бузаджи этот момент пришлось делать криво, ради какой-то там совместимости с предыдущими версиями (в чем она заключается, тоже не знаю).Моя версия: авторы FIBplus поменяли соответствующим образом код своих компонентов, а в хелпе забыли исправить?
Лучше бы ты этот вопрос задал напрямую на devrace.com.
Кстати, а зачем Timeout = 1 ???
"Indicates how long a transaction should be allowed to remain idle before automatically committing or rolling back the data."
установи TimeOut в 0.
Версия FIBplus 6.3.0, свежая, купил пару недель назад.
Дело вот в чем. Просто я обнаружил, что при TimeOut=0 событие OnTimeOut вообще не происходит, и я подумал, что 0 - специальное значение, при котором эта функция компонента отключается.Кстати, а зачем Timeout = 1 ???
"Indicates how long a transaction should be allowed to remain idle before automatically committing or rolling back the data."
установи TimeOut в 0.
значит уже исправили.Версия FIBplus 6.3.0, свежая, купил пару недель назад.
блин. ты доку по FIBPlus читал? Я ж тебе процитировал. Timeout - это автоматическое завершение транзакции через указанный интервал!!! Кому это вообще может пригодиться и когда, и тем более зачем - я вообще не представляю.росто я обнаружил, что при TimeOut=0 событие OnTimeOut вообще не происходит
Ну разве что можно в своих приложениях запрещать транзакциям длиться больше например 20-ти минут, но ТАКИМ способом это все равно не делают.
Не, про это я читал, и в сейчас своей программе TimeOut не использую, а использую AutoCommit. Меня вначале смутило, что в доке по IBX было указано, что TimeOutAction надо выставлять в TACommit, соответственно, чтоб это работало я и делал вначале TimeOut=1. Собственно, непонятка уже не существует.блин
offtop: Спасибо, кстати, за статьи - помогают очень.
а, ясно...я и делал вначале TimeOut=1.

мерси, я старалсяСпасибо, кстати, за статьи - помогают очень.

Конечно, это на самом деле должно быть расписано в доке по FIBPlus.