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

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Quasar
Сообщения: 61
Зарегистрирован: 23 дек 2005, 10:26

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

Сообщение Quasar » 02 фев 2006, 16:14

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 02 фев 2006, 17:33

Моя версия: авторы 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.

Quasar
Сообщения: 61
Зарегистрирован: 23 дек 2005, 10:26

Сообщение Quasar » 03 фев 2006, 06:57

Версия 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 - специальное значение, при котором эта функция компонента отключается.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 фев 2006, 09:41

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

Quasar
Сообщения: 61
Зарегистрирован: 23 дек 2005, 10:26

Сообщение Quasar » 03 фев 2006, 13:24

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

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 фев 2006, 13:55

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

Ответить