crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Транзакции, не работают :(
potkin
  опции профиля:
сообщение 30.8.2010, 11:53
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 18.6.2010
Пользователь №: 1819

Спасибо сказали: 0 раз(а)




Репутация:   0  


Почему-то не работают транзакции.
Пример кода:
if(db.open())
{
db.transaction();
QSqlQuery query(db);

query.exec("INSERT INTO table01 ...");
query.exec("INSERT INTO table02 ...");
...

model01->submitAll();
model02->submitAll();
...

db.rollback(); //!!!!!!!!!!!!!!!!!!!
db.close();
}


Делаю "db.rollback();", но все изменения сохраняются в БД
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 30.8.2010, 11:57
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


Цитата(potkin @ 30.8.2010, 12:53) *
Делаю "db.rollback();", но все изменения сохраняются в БД

а СУБД поддерживает транзакции?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.8.2010, 11:58
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


а submitAll сохраняет, тогда роллбэк вхолостую отрабатывает :) Хотя, обычно это называется commit, но тут, наверное, это одно и то же
Цитата
bool QSqlTableModel::submitAll () [slot]
Submits all pending changes and returns true on success. Returns false on error, detailed error information can be obtained with lastError().

On success the model will be repopulated. Any views presenting it will lose their selections.

Note: In OnManualSubmit mode, already submitted changes won't be cleared from the cache when submitAll() fails. This allows transactions to be rolled back and resubmitted again without losing data.

See also revertAll() and lastError().


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.8.2010, 12:04
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


с моделью вообще всё не так себе. Даже при ручном сохранении (OnManualSubmit), я ещё в цикле пробовал:
Изменения - фиксация, и по новой. Фигушки, только одна транзакция удачно прощодит
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
potkin
  опции профиля:
сообщение 30.8.2010, 12:38
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 18.6.2010
Пользователь №: 1819

Спасибо сказали: 0 раз(а)




Репутация:   0  


а СУБД поддерживает транзакции?

MySQL 5.1
Вроде, с версии выше 4 потдерживает.

Алексей1153
Хотя, обычно это называется commit, но тут, наверное, это одно и то же

Я привёл пример специально, чтоб показать, что при "Откате" транзакции, всё равно всё сохраняется, даже это:
 query.exec("INSERT INTO table01 ...");
query.exec("INSERT INTO table02 ...");


Litkevich Yuriy

И что вообще можите посоветовать ???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 30.8.2010, 12:49
Сообщение #6


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


Точно не помню в каком классе(а ассистента под рукой нет), но помнится были в Qt функции beginTransaction(), commitTransaction() и rollbackTransaction(). Поищи в ассистенте.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.8.2010, 13:10
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(potkin @ 30.8.2010, 16:38) *
MySQL 5.1
Вроде, с версии выше 4 потдерживает.
это зависит от движка, двиг с транзакциями появился не давно. При установке мускуля, нужно ставить переключатель - "использовать оба" ну и при создании БД нужно указывать какой двиг использовать.



Цитата(potkin @ 30.8.2010, 16:38) *
И что вообще можите посоветовать ???
да в принципе ничего. Не созрела Qt ещё для этого. QSqlQuery только нормально работает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
potkin
  опции профиля:
сообщение 30.8.2010, 13:47
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 18.6.2010
Пользователь №: 1819

Спасибо сказали: 0 раз(а)




Репутация:   0  


Litkevich Yuriy
 да в принципе ничего. Не созрела Qt ещё для этого. QSqlQuery только нормально работает

Во папандос :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.8.2010, 16:23
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(potkin @ 30.8.2010, 17:47) *
Во папандос
ага, я аж два дня матюкался. Может будет полезной такая тема: QIBASE + транзакции, не возможно выполнить более одного раза

В принципе я на неё забил.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
potkin
  опции профиля:
сообщение 30.8.2010, 16:37
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 18.6.2010
Пользователь №: 1819

Спасибо сказали: 0 раз(а)




Репутация:   0  


Litkevich Yuriy
Получается мне надо съежать с QSqlTableModel и переходить полностью на QSqlQuery ???
Отказаться от модели и QtableView заполнять используя QSqlQuery, тоесть циклом и также сохранять в БД ???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2024, 23:46