Непонятки с FIBDataSet (использование раздельных транзакций)
Добавлено: 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 поменяли соответствующим образом код своих компонентов, а в хелпе забыли исправить?
Теперь расскажу как это всё работает у меня (логи 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 поменяли соответствующим образом код своих компонентов, а в хелпе забыли исправить?