![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
potkin |
![]() ![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 77 Регистрация: 18.6.2010 Пользователь №: 1819 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Почему-то не работают транзакции.
Пример кода:
Делаю "db.rollback();", но все изменения сохраняются в БД |
|
|
![]() |
DEADHUNT |
![]()
Сообщение
#2
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#3
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
а submitAll сохраняет, тогда роллбэк вхолостую отрабатывает
![]() Цитата 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 |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
с моделью вообще всё не так себе. Даже при ручном сохранении (OnManualSubmit), я ещё в цикле пробовал:
Изменения - фиксация, и по новой. Фигушки, только одна транзакция удачно прощодит |
|
|
potkin |
![]()
Сообщение
#5
|
Студент ![]() Группа: Участник Сообщений: 77 Регистрация: 18.6.2010 Пользователь №: 1819 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
MySQL 5.1 Вроде, с версии выше 4 потдерживает. Алексей1153
Я привёл пример специально, чтоб показать, что при "Откате" транзакции, всё равно всё сохраняется, даже это:
Litkevich Yuriy И что вообще можите посоветовать ??? |
|
|
molchanoviv |
![]()
Сообщение
#6
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 597 Регистрация: 18.7.2008 Из: Саратов Пользователь №: 238 Спасибо сказали: 41 раз(а) Репутация: ![]() ![]() ![]() |
Точно не помню в каком классе(а ассистента под рукой нет), но помнится были в Qt функции beginTransaction(), commitTransaction() и rollbackTransaction(). Поищи в ассистенте.
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#7
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
MySQL 5.1 это зависит от движка, двиг с транзакциями появился не давно. При установке мускуля, нужно ставить переключатель - "использовать оба" ну и при создании БД нужно указывать какой двиг использовать.Вроде, с версии выше 4 потдерживает. И что вообще можите посоветовать ??? да в принципе ничего. Не созрела Qt ещё для этого. QSqlQuery только нормально работает
|
|
|
potkin |
![]()
Сообщение
#8
|
Студент ![]() Группа: Участник Сообщений: 77 Регистрация: 18.6.2010 Пользователь №: 1819 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Litkevich Yuriy
Во папандос ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#9
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Во папандос ага, я аж два дня матюкался. Может будет полезной такая тема: QIBASE + транзакции, не возможно выполнить более одного разаВ принципе я на неё забил. |
|
|
potkin |
![]()
Сообщение
#10
|
Студент ![]() Группа: Участник Сообщений: 77 Регистрация: 18.6.2010 Пользователь №: 1819 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Litkevich Yuriy
Получается мне надо съежать с QSqlTableModel и переходить полностью на QSqlQuery ??? Отказаться от модели и QtableView заполнять используя QSqlQuery, тоесть циклом и также сохранять в БД ??? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#11
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
я поступил по другому: логика работы программы допускала мелкие транзакции, хотя они и были нежелательны.
Т.е. я выкинул db.transaction(); db.rollback(); и т.п. а чтобы ничего страшного нельзя было сделать повсеместно использую (конечный) автомат управления кнопками "отмена/сохранить" и блокировку виджетов. Если начал пользователь работать в одном месте, куча виджетов блокируется, пока он не нажмёт либо "отмена", либо "сохранить". |
|
|
potkin |
![]()
Сообщение
#12
|
Студент ![]() Группа: Участник Сообщений: 77 Регистрация: 18.6.2010 Пользователь №: 1819 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Litkevich Yuriy,
Это как получается. Если на форме есть виджеты и каждая группа виджетов отображает (редактирует/сохраняет) данные из разных таблиц и которые НЕЛЬЗА сохранить в контексте ОДНОЙ транзакции, то: Пока пользователь работает с одной группой виджетов, остальные блокируются, пока он не сохранит эти данные в контексте какой-то транзакции. Потом 2-ю группу виджетов редактирует, остальные блокируются, пока не сохранит ... и т.д. ![]() Правильно ??? |
|
|
Алексей1153 |
![]()
Сообщение
#13
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
potkin, я работаю с MySQL 5+ из студии через ихний апи, который они прилагают. Транзакции работают. А ещё, можно сделать встроенную процедуру и там работать с транзакциями
Всё редактирование можно хранить в озу, а по кнопке закидывать в базу (если так возможно) |
|
|
potkin |
![]()
Сообщение
#14
|
Студент ![]() Группа: Участник Сообщений: 77 Регистрация: 18.6.2010 Пользователь №: 1819 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
potkin, я работаю с MySQL 5+ из студии через ихний апи, который они прилагают. Транзакции работают. А ещё, можно сделать встроенную процедуру и там работать с транзакциями. Всё редактирование можно хранить в озу, а по кнопке закидывать в базу (если так возможно) Мне бы в контексте одной транзакции как-то сохранить модель (QSqlTableModel ) и запрос (QSqlQuery) ..... ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#15
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Правильно ??? да. Для пользователя это более интуитивно, чем в случае, когда пользователь сделал одно, полез в другое, а потом сохранять в произвольном порядке. При этом БД ему что-то пишет об ошибке в ответ на неродном языке. Он это воспринимает как кривость программы (вобщем-то он прав)
|
|
|
Алексей1153 |
![]()
Сообщение
#16
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
potkin, а что значит "сохранить модель" и "сохранить запрос" ?
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#17
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#18
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
вот не люблю эту автоматизацию. Надо так: делаешь себе правки, никого не трогаешь. Потом - жамк кнопку - сделался sql запрос/вызвалась процедура - и всё. А тут так и будешь стараться держать, чтоб всё не разбежалось по углам ))
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 4.5.2025, 7:16 |