Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > Изменение БД 2-мя приложениями


Автор: php5 26.1.2009, 18:24
Есть приложение которое работает с БД  Firebird 2.0  так вот если  одновременно запушены 2 приложения  и  1-е вносит изменение в БД то 2-е это изменение не видит, но стоит только   закрыть 1-е приложение как  2-е приложение эти изменения уже видит . Как решить данную проблему ?  
 

Автор: REZiaMIX 26.1.2009, 19:17
Может быть первое приложение не делает commit  ?

Автор: php5 27.1.2009, 10:38
Ну изменения в БД я вношу так :

IBQuery->Close();
IBQuery->SQL->Clear();
IBQuery->SQL->Add(sql);
IBQuery->ExecSQL();

Походу ExecSQL() должно закрывать транзакцию , по поводу кэширования то я его явно ни где не включал . У меня идет такая связка компонентов :
IBDatabase-> DefaultTransaction= IBTransaction
IBQuery-> Database= IBDatabase
Где можно посмотреть не включено ли кэширование ?

Автор: Fazil6 27.1.2009, 10:49
Цитата(php5 @  27.1.2009,  10:38 Найти цитируемый пост)
Походу ExecSQL() должно закрывать транзакцию

нет. Нужно делать Commit() соответствующей транзакции. Ты ведь можешь делать несколько ExecSQL() и решать когда нужно закомитить изменения должен сам.

Автор: php5 27.1.2009, 13:32
Поле того как я вызываю  IBTransaction->Commit();  то у   IBQuery    соединение с базой  закрывается , это можно как то исправить  ?  или нужно делать явно пере подключение  

Автор: Fazil6 27.1.2009, 14:31
Цитата(php5 @  27.1.2009,  13:32 Найти цитируемый пост)
Поле того как я вызываю  IBTransaction->Commit();  то у   IBQuery    соединение с базой  закрывается , это можно как то исправить  ?  или нужно делать явно пере подключение   

не нужно делать все в одной транзакции. После Commit все DataSet, связанные с транзакцией закрываются. Это совершенно естественное поведение при работе с БД. Возми за правило, что читающие транзакции отдельно, редактирующие - отдельно. Есть еще такой метод CommitRetain, он делает Commit и открывает транзакцию заново (DataSet-s как бы не закрываются), но эту фишку я очень сильно не рекомендую использовать (ту же рекомендацию ты можешь найти и в доках по Firebird/IB) потому как ресурсы сервера она может пожирать с катострофической скоростью и полюбому правильное ее использование предполагает в игоге все равно вызов Commit().
Вообще как правило при работе открывают транзакцию и в ней читают/перечитывают данные. Если надо внести изменения открывают редактирующую транзакцию, редактируют и Commit. После этого если надо обновляют DataSet-ы в читающей(их) транзакции(ях) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)