Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Транзакции через серию запросов 
:(
    Опции темы
Keeper89
Дата 17.1.2011, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



Доброго времени суток.

Имеется функция Delphi для выполнения простых запросов (Execute).
Как используя только ее, можно реализовать механизм транзакция в виде:
Код

НАЧАЛО ТРАНЗАКЦИИ
Команда 1
Команда 2
...
Команда N
КОНЕЦ ТРАНЗАКЦИИ

При этом необходимо предусмотреть откат всех операций в случае ошибки.

Заранее спасибо за предложенные идеи/варианты.


--------------------
PM MAIL WWW   Вверх
Zloxa
Дата 17.1.2011, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



не завершать транзакцию внутри функции Delphi для выполнения простых запросов (Execute) и откатывать транзакцию в случае возникновения ошибки.

Это сообщение отредактировал(а) Zloxa - 17.1.2011, 23:59


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Keeper89
Дата 18.1.2011, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



Zloxa, пока имеется вот такой фрагмент:
Код

Result := ExecSQL('SAVEPOINT ' + s);
   try
     for i := 0 to ASQLList.Count - 1 do
     begin
       if Trim(ASQLList[i]) = '' then
         Continue;
       Result := ExecSQL(ASQLList[i]);
       if not Result then
         Break;
     end;
    except
      ExecSQL('ROLLBACK TO SAVEPOINT ' + s);
      raise
    end;

   if Result then
     Result := ExecSQL('COMMIT'
   else
     Result := ExecSQL('ROLLBACK TO SAVEPOINT' + s)



--------------------
PM MAIL WWW   Вверх
Zloxa
Дата 18.1.2011, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(Keeper89 @  18.1.2011,  00:39 Найти цитируемый пост)
пока имеется вот такой фрагмент

о чем мне этот фрагмент, с Вашей точки зрения, должен рассказать?

Это сообщение отредактировал(а) Zloxa - 18.1.2011, 08:49


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 18.1.2011, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Зачем откат вы производите на сейвпоинт? Почему не просто rollback?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Keeper89
Дата 18.1.2011, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



чтобы откатиться и определенному моменту, или я неправильно понимаю? 


--------------------
PM MAIL WWW   Вверх
Zloxa
Дата 18.1.2011, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Keeper89, а коммитите вы тоже определенный момент?

Просто не однозначно какт-то. В случае успеха вы коммитите всю транзакцию, в случае ошибки - откатываете только ее часть. Обычно так не делают.

Откат к сейвпоинту обычно применяют в процедурах, не управляющих транзакцией - не начинающих ее и не завершающих. Предполагается, что управление транзакциясми в этом случае производится уровнем выше. Если же ваша процедура таки управляет транзакцией, то откатывайте ее уж полностью.

Это сообщение отредактировал(а) Zloxa - 18.1.2011, 14:00


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Keeper89
Дата 18.1.2011, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



Цитата(Zloxa @  18.1.2011,  11:43 Найти цитируемый пост)
Просто не однозначно как-то. В случае успеха вы коммитите всю транзакцию, в случае ошибки - откатываете только ее часть. Обычно так не делают.

Нет, коммит подразумевается только для того, что сделано с сейвпоинта. Может я синтаксически неверно это оформил?

Переделал следующим образом (на ХП):
Код

BEGIN
    SAVEPOINT %1;
    {СПИСОК ЗАПРОСОВ}
    COMMIT;
    EXCEPTION
        WHEN OTHERS
            THEN ROLLBACK TO SAVEPOINT %1;
END;

Так более грамотно, или лучше вообще убрать сейвпоинт и просто делать ROLLBACK?


--------------------
PM MAIL WWW   Вверх
Zloxa
Дата 18.1.2011, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(Keeper89 @  18.1.2011,  22:52 Найти цитируемый пост)
коммит подразумевается только для того, что сделано с сейвпоинта

так не бывает.
Коммит зафиксирует все что было понаделано и до сейвпоинта(если  было).
Именно поэтому роллбак к сейвпоинту рядом с коммитом выглядит несколько... неорганично.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Keeper89
Дата 19.1.2011, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



Zloxa, а как лучше записать тогда, чтобы применять/откатывать только часть инструкций?

Добавлено через 4 минуты и 10 секунд
Цитата(Keeper89 @  18.1.2011,  22:52 Найти цитируемый пост)
Так более грамотно, или лучше вообще убрать сейвпоинт и просто делать ROLLBACK? 




--------------------
PM MAIL WWW   Вверх
Zloxa
Дата 19.1.2011, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Keeper89, сколько мне еще раз повторить что коммит "части инструкций" не бывает? Сколько мне еще раз повторить, что там где используется коммит, уместен роллбек, а не ролбек к сейвпоинту?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Keeper89
Дата 20.1.2011, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



Цитата(Zloxa @  19.1.2011,  09:57 Найти цитируемый пост)
Keeper89, сколько мне еще раз повторить что коммит "части инструкций" не бывает? Сколько мне еще раз повторить, что там где используется коммит, уместен роллбек, а не ролбек к сейвпоинту? 

Т.е. здесь имеется ошибка?
Код

BEGIN
    {СПИСОК ЗАПРОСОВ}
    COMMIT;
    EXCEPTION
        WHEN OTHERS
            THEN ROLLBACK;
END;

Так правильно?

И если 
Цитата(Zloxa @  19.1.2011,  09:57 Найти цитируемый пост)
коммит "части инструкций" не бывает

как можно разобраться с моей проблемой?



--------------------
PM MAIL WWW   Вверх
Zloxa
Дата 20.1.2011, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(Keeper89 @  20.1.2011,  01:38 Найти цитируемый пост)
Т.е. здесь имеется ошибка?

Где Вы там узрели фиксацию транзакции?
Цитата(Keeper89 @  20.1.2011,  01:38 Найти цитируемый пост)
Так правильно?

так - разумно.
правильно было и раньше.
одна оговорка, эксепшн чтоб не терять
Код

BEGIN
    {СПИСОК ЗАПРОСОВ}
    COMMIT;
    EXCEPTION
        WHEN OTHERS
            THEN ROLLBACK;raise;
END;

Цитата(Keeper89 @  20.1.2011,  01:38 Найти цитируемый пост)
как можно разобраться с моей проблемой?

Наверняка - можно, просто Я не понимаю в чем Ваша проблема и о чем мы тут в этом топике дискутируем.
Сдается мне, Вам просто вскучнулось и Вы решили уныло пообсуждать банальные вещи.

Это сообщение отредактировал(а) Zloxa - 20.1.2011, 09:48


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.