Название: QSqlDataBase и Thread [Решено] Отправлено: santaclaus от Апрель 13, 2011, 08:11 Всем доброго времени суток!
Задача такая: есть приложение, нужно отделить графическую часть от части обновления данных, соответственно все что работает с БД, вынес в отдельный поток....но тут столкнулся с такими граблями - Есть 1 запрос который просто выдергивает данные, есть 2 запрос который обновляет табличку методом Update...собственно проблема такая, выдернул данные, обновил, снова выдергиваю и запрос возвращает старые данные, которые были до изменения....снова обновляю, опять запрашиваю и вижу что выводиться операция с обновленными данными на 1 шаге....и так все время, идет задержка в 1 шаг....при этом смотрю в PLSQL Developer'e там все отлично...может кто сталкивался... вот пример кода для работы с БД: Код: // сам класс потока Ах да, Qt 4.7, Win7 Ultimate, БД Oracle Уже переделал что бы это был не поток, а обычный класс, все равно работает так же криво.... Название: Re: QSqlDataBase и Thread Отправлено: twp от Апрель 13, 2011, 12:26 Во-первых, методы
Код: void setDataToParking(); Во-вторых, нужно фиксировать транзакцию, чтоб данные сразу были доступны при последующей выборке данных Название: Re: QSqlDataBase и Thread Отправлено: santaclaus от Апрель 13, 2011, 13:12 Во-вторых, нужно фиксировать транзакцию, чтоб данные сразу были доступны при последующей выборке данных это реализовано на стороне БД.Сейчас выявил забавную вещь....просто сделал табличку куда делаю Update и Select * from ИМЯ_ТАБЛИЦЫ, все отлично.... а вот когда вместе выше описанного селекта делаю Select * from table()....получаю свою проблему. Попробую переделать на обычный селект с указаниями таблиц. Ну и попробую решить как то проблему с конструкцией Select from table(). О результат отпишусь. Название: Re: QSqlDataBase и Thread Отправлено: santaclaus от Апрель 15, 2011, 13:12 Ребята, вопрос разрешился.
Дело оказалось таким: в потоке вызывается процедуры update данных которая стартует с помощью query.exec() и дальше запускается тут же процедура select данных которая стартует таким же методом, при этом, эти процедуры стартуют фактически одновременно что и вызывало парадокс описанный выше. Ну вот и получается что exec() в данном случае идут не друг за другом а почти что параллельно, а так как время выполнения процедур разное вот и складывалось ощущение задержки на один шаг) Может кому то буде полезным. ; ) |