CftClub.ru
Клуб специалистов ЦФТ-Банк

К вопросу об управлении транзакциями

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
vek21
Участник со стажем


Вступление в Клуб: 20.09.2007
СообщениеСр Ноя 28, 2018 07:13   К вопросу об управлении транзакциями Ответить с цитатой
Полезность: Нет оценки
Уважаемые знатоки!
Как объяснить ситуацию, когда в валидаторе операции устанавливается savepoint BBB, в теле вызывается rollback to BBB, а при вызове операции навигатор выдает ошибку "В настоящий момент операция невозможна:
точка отката 'BBB' никогда не устанавливалась в этом сеансе или является недействительной"
Вот код валидатора:
Код:

begin
   if P_MESSAGE = 'DEFAULT' then
      P_INFO := 'OK';
   elsif P_MESSAGE = 'VALIDATE' then
      if P_INFO = 'OK' then
         savepoint BBB;
      end if;
   end if;
end;

Код тела:
Код:

begin
   rollback to BBB;
end;
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеСр Ноя 28, 2018 09:24    Ответить с цитатой
Полезность: Нет оценки
В чем необходимость открытия BBB именно в валидаторе?
Устанавливайте BBB и rollback в теле...ошибки, при прочих равных не будет...
De Mian
Профи


Вступление в Клуб: 26.09.2008
СообщениеСр Ноя 28, 2018 10:03   Re: К вопросу об управлении транзакциями Ответить с цитатой
Полезность: Нет оценки
vek21 пишет:
Уважаемые знатоки!
Как объяснить ситуацию, когда в валидаторе операции устанавливается savepoint BBB, в теле вызывается rollback to BBB, а при вызове операции навигатор выдает ошибку "В настоящий момент операция невозможна:
точка отката 'BBB' никогда не устанавливалась в этом сеансе или является недействительной"
[/code]

1) Не валидируемым контролом OK.
2) Не нажатой галочкой "Операция контролирует транзакцию" на вкладке "Дополнительные свойства". Если галочка не нажата то навигатор при выполнении как тела так и валидатора выполняет commit.
vek21
Участник со стажем


Вступление в Клуб: 20.09.2007
СообщениеСр Ноя 28, 2018 13:01    Ответить с цитатой
Полезность: Нет оценки
По п.1 - не верю. В секции DEFAULT прописано, что "P_INFO := 'OK'" Это и означает, что контрол OK валидируемый. Это легко проверить)))
По п.2 - тоже как-то не верю. Если убрать savepoitnы и rollbackи из предложенной операции и посмотреть сгенерированный пакет - там нет вообще никаких обращений к (системным) пакетам, в которых присутствуют commitы или rollbackи. Это говорит о том, что коммитит выполнение операции уже сам Навигатор, если из него операция вызвана, и уж точно не коммитится отдельно валидатор и отдельно тело.
vek21
Участник со стажем


Вступление в Клуб: 20.09.2007
СообщениеСр Ноя 28, 2018 13:09    Ответить с цитатой
Полезность: Нет оценки
Матвеев Евгений пишет:
В чем необходимость открытия BBB именно в валидаторе?
Устанавливайте BBB и rollback в теле...ошибки, при прочих равных не будет...

Дело просто в том что в операции должны вызываться еще куча других операций. Для этого используются PLPCALLы. Их удобнее всего располагать в валидаторе, так как результаты вызовов можно будет заценить только в теле. А так как при работе этих вызванных операций возможны нештатные ситуации, хотелось бы иметь возможность откатиться из тела операции в начало операции, то есть как раз в начало валидатора...
De Mian
Профи


Вступление в Клуб: 26.09.2008
СообщениеСр Ноя 28, 2018 14:10    Ответить с цитатой
Полезность: Нет оценки
vek21 пишет:
По п.1 - не верю. В секции DEFAULT прописано, что "P_INFO := 'OK'" Это и означает, что контрол OK валидируемый. Это легко проверить)))

Да, про пункт 1 не увидел в примере. Я в целом причины описал, почему такая ситуация может происходить.
vek21 пишет:
По п.2 - тоже как-то не верю. Если убрать savepoitnы и rollbackи из предложенной операции и посмотреть сгенерированный пакет - там нет вообще никаких обращений к (системным) пакетам, в которых присутствуют commitы или rollbackи. Это говорит о том, что коммитит выполнение операции уже сам Навигатор, если из него операция вызвана, и уж точно не коммитится отдельно валидатор и отдельно тело.

Ну а так. Пункт 2 легко же проверить ?
Кроме сгененированых пакетов в этом конечно участвует ЦФТ-навигатор. Это он управляет транзакций в зависимости от настройки "Операция контролирует транзакцию". Косвенно, в пользу этого говорит то что изменение указанной настройки не ведет к изменению PLSQL кода, но проявляется только после перезагрузки навигатора либо выгрузки описаний операций и представлений.
Если просто, то Навигатор выполняет 2 блока
Код:
begin
     ВАЛИДАТОР;
     COMMIT; -- наличие зависит от настройки. по кнопке ОТМЕНА с крыжом "Операция контролирует транзакцию" происходит откат транзакции
end;
begin
     ТЕЛО_ОПЕРАЦИИ;
     COMMIT;
end;

vek21 пишет:
и уж точно не коммитится отдельно валидатор и отдельно тело.

Не верно. это легко проверить.


Последний раз редактировалось: De Mian (Ср Ноя 28, 2018 14:27), всего редактировалось 4 раз(а)
De Mian
Профи


Вступление в Клуб: 26.09.2008
СообщениеСр Ноя 28, 2018 14:19    Ответить с цитатой
Полезность: Нет оценки
vek21 пишет:
Дело просто в том что в операции должны вызываться еще куча других операций. Для этого используются PLPCALLы. Их удобнее всего располагать в валидаторе, так как результаты вызовов можно будет заценить только в теле. А так как при работе этих вызванных операций возможны нештатные ситуации, хотелось бы иметь возможность откатиться из тела операции в начало операции, то есть как раз в начало валидатора...

не уверен что это возможно. но как минимум пробуйте при установленном в вызывающей операции крыже "Операция контролирует транзакцию". Без него точно не будет работь.
Но а так PLPCALL - это просто каманда навигатору запустить другую операцию. Другая операция будет выполнена и все равно зафиксирует транзакцию. так что откатываться будет опять некуда. надо пробовать
De Mian
Профи


Вступление в Клуб: 26.09.2008
СообщениеСр Ноя 28, 2018 14:44    Ответить с цитатой
Полезность: Нет оценки
De Mian пишет:
не уверен что это возможно. но как минимум пробуйте при установленном в вызывающей операции крыже "Операция контролирует транзакцию". Без него точно не будет работь.
Но а так PLPCALL - это просто каманда навигатору запустить другую операцию. Другая операция будет выполнена и все равно зафиксирует транзакцию. так что откатываться будет опять некуда. надо пробовать

Был не прав. такое возможно.По видимому, навигатор учитывает из какой операции были вызваны другие операции через PLPCALL и CALL. и если у вызывающей операции стоит "Операция контролирует транзакцию", то вызываемая операция по OK не фиксирует транзакцию и транзакция полностью контролируется вызывающей операцией.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru