К вопросу об управлении транзакциями
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 не фиксирует транзакцию и транзакция полностью контролируется вызывающей операцией. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|