Russian Qt Forum
Ноябрь 23, 2024, 22:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: PostgreSQL и автоматический rollback транзакции после ошибки.  (Прочитано 9834 раз)
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« : Ноябрь 21, 2008, 21:36 »

Такая нехорошая ситуёвина. Если в пределах транзакции произошла ошибка (допустим пытаюсь дропнуть индекс, а его нет), транзакция автоматом роллбекается, что есть очень плохо. Можно как-нибудь этого избежать?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BaltikS
Гость
« Ответ #1 : Ноябрь 21, 2008, 22:55 »

Нет, транзакция для этого и нужна, чтобы откатить целый блок. А если ошибка вызывается в одном запросе, то откатывается весь блок. Можно попробовать запрос выполнить вне транзакции или в другой транзакции.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Ноябрь 21, 2008, 23:32 »

Да без базара, я САМ откачу, если нужно будет. Но делать это за меня - ппц. Предаставь, что есть куча диалогов на одну транзакцию, и в, допустим, четвертом диалоге пользователь не указывает переменную, которая не должна быть NULL, в этом месте нужно просто вывести ошибку и дать исправить, но не откатывать транзакцию и выбивать ошибки во всех нижних диалогах. Хотя, возможно, я что-то не так понимаю.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BaltikS
Гость
« Ответ #3 : Ноябрь 22, 2008, 00:23 »

Что то я тоже не понимаю, а нельзя ли сделать самому проверку на NULL в диалоге? А не средствами СУБД?
Я например сначала ввёл все данные во всех последовательно 4-х диалогах, а потом все данные в транзакцию запихнул без всяких ожиданий ввода...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Ноябрь 22, 2008, 14:12 »

Да придется так. Вот только код разрастется. Грустный Вроде на firebird'е не так было, хотя утверждать не буду.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Rcus
Гость
« Ответ #5 : Ноябрь 22, 2008, 17:34 »

Такая нехорошая ситуёвина. Если в пределах транзакции произошла ошибка (допустим пытаюсь дропнуть индекс, а его нет), транзакция автоматом роллбекается, что есть очень плохо. Можно как-нибудь этого избежать?
Ошибки с DDL запросами можно игнорировать добавлением IF [NOT] EXISTS, а DML оборачивать в PL/pgSQL функции, обрабатывая исключения в блоке EXCEPTION
 и проверять код возврата в вызывающем коде Улыбающийся
« Последнее редактирование: Ноябрь 22, 2008, 17:35 от Rcus » Записан
WW
Гость
« Ответ #6 : Ноябрь 22, 2008, 18:01 »

Да без базара, я САМ откачу, если нужно будет. Но делать это за меня - ппц. Предаставь, что есть куча диалогов на одну транзакцию, и в, допустим, четвертом диалоге пользователь не указывает переменную, которая не должна быть NULL, в этом месте нужно просто вывести ошибку и дать исправить, но не откатывать транзакцию и выбивать ошибки во всех нижних диалогах. Хотя, возможно, я что-то не так понимаю.

Никогда не делай диалоги в транзакции. Эт не хорошая практика.
И почитай про SAVEPOINT. Иногда помогает Улыбающийся
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #7 : Ноябрь 22, 2008, 20:33 »

Никогда не делай диалоги в транзакции. Эт не хорошая практика.
+писот. проверенно практикой...
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Tonal
Гость
« Ответ #8 : Ноябрь 26, 2008, 09:21 »

А ты явно управляешь транзакциями?
Может где можно сказать драйверу. чтобы не самовольничал?
Ну и в Firebird-е управление транзакциями - всегда пользовательское а что в PG я не в курсе - нужно читать доки.

Ну и про диалоги - я придерживаюсь правила, что пишущую транзакцию нужно стартовать только тогда, когда все данные уже доступны и по максиму верифицированы. Тогда они получаются короткими - соответственно гораздо меньше шансов нарваться на конфликт. Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Ноябрь 27, 2008, 07:22 »

Хм. Как бы объяснить... В первом диалоге сразу создается документ, его id нужен для других диалогов. Если не пользоваться транзакциями, то в код нужно добавить удаление документа, если юзверь нажал отмену. Да и не очень хорошо будет, если документ отобразиться у других юзверей пока его толком еще не создали.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Tonal
Гость
« Ответ #10 : Ноябрь 28, 2008, 10:01 »

Не, ты не понял.
Я создаю в таких случаях создаю все объекты на клиенте, не трогая базу.
А вот когда нажимается финальный Save, максимально возможно валидируются все объекты, стартуется транзакция, всё скопом пишется в базу, транзакция коммитится.
Ежели вышел облом по ограничениям базы, то можно и перезапустить процесс с нужного места со всеми введёнными данными. Улыбающийся

А с длинными транзакциями есть практически неустранимая бяка, когда товарищ, заполняющий данные, пошёл покурить и не вернулся, оставив диалог и транзакцию висеть блокируя работу остальных.
« Последнее редактирование: Ноябрь 28, 2008, 10:04 от Tonal » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Ноябрь 28, 2008, 12:29 »

У меня так не получится. Добавил проверку на правильность ввода перед сохранением в базу.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
WW
Гость
« Ответ #12 : Ноябрь 29, 2008, 01:13 »

У меня так не получится. Добавил проверку на правильность ввода перед сохранением в базу.
"Никогда не говори никогда" (с)
Уже было 1000 раз, когда кто-то просто отвлекся на тел. звонок (клиента).
И весь офис ищет этого "шалуна", т.к. работа просто встала...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 23.