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