Страница 1 из 1

Непонятки с FIBDataSet (использование раздельных транзакций)

Добавлено: 02 фев 2006, 16:14
Quasar
Использую 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 поменяли соответствующим образом код своих компонентов, а в хелпе забыли исправить?

Добавлено: 02 фев 2006, 17:33
kdv
Моя версия: авторы FIBplus поменяли соответствующим образом код своих компонентов, а в хелпе забыли исправить?
не знаю. эта тема обсуждалась на sql.ru в момент написания статьи с разработчиком FIBPLus. Вроде бы тогда был FIBPlus 6.25. Какой он у тебя версии - я понятия не имею. Знаю что Бузаджи этот момент пришлось делать криво, ради какой-то там совместимости с предыдущими версиями (в чем она заключается, тоже не знаю).

Лучше бы ты этот вопрос задал напрямую на 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.

Добавлено: 03 фев 2006, 06:57
Quasar
Версия FIBplus 6.3.0, свежая, купил пару недель назад.
Кстати, а зачем Timeout = 1 ???
"Indicates how long a transaction should be allowed to remain idle before automatically committing or rolling back the data."

установи TimeOut в 0.
Дело вот в чем. Просто я обнаружил, что при TimeOut=0 событие OnTimeOut вообще не происходит, и я подумал, что 0 - специальное значение, при котором эта функция компонента отключается.

Добавлено: 03 фев 2006, 09:41
kdv
Версия FIBplus 6.3.0, свежая, купил пару недель назад.
значит уже исправили.
росто я обнаружил, что при TimeOut=0 событие OnTimeOut вообще не происходит
блин. ты доку по FIBPlus читал? Я ж тебе процитировал. Timeout - это автоматическое завершение транзакции через указанный интервал!!! Кому это вообще может пригодиться и когда, и тем более зачем - я вообще не представляю.
Ну разве что можно в своих приложениях запрещать транзакциям длиться больше например 20-ти минут, но ТАКИМ способом это все равно не делают.

Добавлено: 03 фев 2006, 13:24
Quasar
блин
Не, про это я читал, и в сейчас своей программе TimeOut не использую, а использую AutoCommit. Меня вначале смутило, что в доке по IBX было указано, что TimeOutAction надо выставлять в TACommit, соответственно, чтоб это работало я и делал вначале TimeOut=1. Собственно, непонятка уже не существует.

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

Добавлено: 03 фев 2006, 13:55
kdv
я и делал вначале TimeOut=1.
а, ясно... :)
Спасибо, кстати, за статьи - помогают очень.
мерси, я старался :) а еще лучше - присылать пожелания, исправления и т.п. Кстати, я в статью по ibx добавил комментарий, что вот эта упоминаемая тут особенность может зависеть от версии FIBPlus.
Конечно, это на самом деле должно быть расписано в доке по FIBPlus.