crossplatform.ru

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

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();", но все изменения сохраняются в БД
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 17)
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


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

Группа: Участник
Сообщений: 2943
Регистрация: 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, тоесть циклом и также сохранять в БД ???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.8.2010, 16:41
Сообщение #11


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

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

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




Репутация:   94  


я поступил по другому: логика работы программы допускала мелкие транзакции, хотя они и были нежелательны.
Т.е. я выкинул
db.transaction();
db.rollback();
и т.п.

а чтобы ничего страшного нельзя было сделать повсеместно использую (конечный) автомат управления кнопками "отмена/сохранить" и блокировку виджетов. Если начал пользователь работать в одном месте, куча виджетов блокируется, пока он не нажмёт либо "отмена", либо "сохранить".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
potkin
  опции профиля:
сообщение 30.8.2010, 18:04
Сообщение #12


Студент
*

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

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




Репутация:   0  


Litkevich Yuriy,
Это как получается.
Если на форме есть виджеты и каждая группа виджетов отображает (редактирует/сохраняет) данные из разных таблиц и которые НЕЛЬЗА сохранить в контексте ОДНОЙ транзакции, то:
Пока пользователь работает с одной группой виджетов, остальные блокируются, пока он не сохранит эти данные в контексте какой-то транзакции.
Потом 2-ю группу виджетов редактирует, остальные блокируются, пока не сохранит ...
и т.д.
:wacko:

Правильно ???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.8.2010, 18:46
Сообщение #13


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

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

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




Репутация:   34  


potkin, я работаю с MySQL 5+ из студии через ихний апи, который они прилагают. Транзакции работают. А ещё, можно сделать встроенную процедуру и там работать с транзакциями

Всё редактирование можно хранить в озу, а по кнопке закидывать в базу (если так возможно)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
potkin
  опции профиля:
сообщение 30.8.2010, 21:32
Сообщение #14


Студент
*

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

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




Репутация:   0  


Цитата(Алексей1153 @ 30.8.2010, 18:46) *
potkin, я работаю с MySQL 5+ из студии через ихний апи, который они прилагают. Транзакции работают. А ещё, можно сделать встроенную процедуру и там работать с транзакциями.
Всё редактирование можно хранить в озу, а по кнопке закидывать в базу (если так возможно)

Мне бы в контексте одной транзакции как-то сохранить модель (QSqlTableModel ) и запрос (QSqlQuery) ..... :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.8.2010, 22:18
Сообщение #15


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

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

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




Репутация:   94  


Цитата(potkin @ 30.8.2010, 22:04) *
Правильно ???
да. Для пользователя это более интуитивно, чем в случае, когда пользователь сделал одно, полез в другое, а потом сохранять в произвольном порядке. При этом БД ему что-то пишет об ошибке в ответ на неродном языке. Он это воспринимает как кривость программы (вобщем-то он прав)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.8.2010, 6:38
Сообщение #16


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

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

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




Репутация:   34  


potkin, а что значит "сохранить модель" и "сохранить запрос" ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.8.2010, 7:31
Сообщение #17


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

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

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




Репутация:   94  


Цитата(Алексей1153 @ 31.8.2010, 10:38) *
а что значит "сохранить модель" и "сохранить запрос" ?
по-моему всё очевидно. Данные из модели отправляются в БД, запрос также изменяет БД. И нужно чтобы это была атомарная операция
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.8.2010, 8:16
Сообщение #18


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

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

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




Репутация:   34  


вот не люблю эту автоматизацию. Надо так: делаешь себе правки, никого не трогаешь. Потом - жамк кнопку - сделался sql запрос/вызвалась процедура - и всё. А тут так и будешь стараться держать, чтоб всё не разбежалось по углам ))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 4.5.2025, 7:16