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