| 
 
  
	| Управление транзакциями На страницу 1, 2  След.
 
 |  
	
		| Предыдущая тема :: Следующая тема |  
		| Автор | Сообщение |  
		| storysoft Участник со стажем
 
 
 Вступление в Клуб: 18.07.2014
 
 | 
			
				|  Пн Июл 20, 2015 14:31   Управление транзакциями |   |  
				| Полезность: Нет оценки 
 |  
				| Коллеги подскажите: в своей процедуре вызываю две дистрибутивных операции, одна из которых создает клиента, вторая договор РКО к нему. Перед вызовом ставлю точку отката. Пытаюcь откатить создание РКО и клиента (например ошибка) и получаю ошибку, что точка отката 'SP4151697142A$1' никогда не устанавливалась в этом сеансе или является недействительной. 
 Получается в дистрибутивной процедуре произошел commit.
 Можно ли отключить commit в дистрибутивной процедуре? Может какие-то параметры передать?
 |  |  
		|  |  
		| Alkov Профи
 
 
 Вступление в Клуб: 23.09.2010
 
 | 
			
				|  Вт Июл 21, 2015 02:16    |   |  
				| Полезность: Нет оценки 
 |  
				| отключить думаю нет, можно только взять вызов в автономную транзакцию, тогда закоммититься только то что делалось в процедуре, а то что было до её вызова останется незакоммиченым. |  |  
		|  |  
		| Random Эксперт
 
 
 Вступление в Клуб: 27.06.2011
 
 | 
			
				|  Вт Июл 21, 2015 08:53    |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | Alkov пишет: |  	  | отключить думаю нет, можно только взять вызов в автономную транзакцию, тогда закоммититься только то что делалось в процедуре, а то что было до её вызова останется незакоммиченым. | 
 
 Теоретически можно пометить транзакцию как READ ONLY, но это приведёт только к исключению в момент commit.
 
 Возможно, в процедуре предусмотрены какие-то параметры, чтобы не делать commit, но для этого нужно хотя бы знать, какую дистрибутивную операцию вы пользуете.
 |  |  
		|  |  
		| vtar Эксперт
 
 
 Вступление в Клуб: 20.03.2009
 
 | 
			
				|  Вт Июл 21, 2015 11:30   Re: Управление транзакциями |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | storysoft пишет: |  	  | Пытаюcь откатить создание РКО и клиента | 
 
 может, в Вашем случае откатывать удалением этих сущностей ?
 |  |  
		|  |  
		| storysoft Участник со стажем
 
 
 Вступление в Клуб: 18.07.2014
 
 | 
			
				|  Ср Июл 22, 2015 17:40   Re: Управление транзакциями |   |  
				| Полезность: Нет оценки 
 |  
				| Откатывать уже нечего, так как в дистрибутивной операции создания рко (например :[RKO].[new#auto_lib]) и клиента произошел commit (причем два раза сначала при создании клиента, потом при создании РКО). 
 Где вообще в обычной дистрибутивной  операции (например создания клиента юрика) прописан commit? Я не нашел. Может где-то в системной части?
 |  |  
		|  |  
		| Random Эксперт
 
 
 Вступление в Клуб: 27.06.2011
 
 | 
			
				|  Чт Июл 23, 2015 07:29   Re: Управление транзакциями |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | storysoft пишет: |  	  | Откатывать уже нечего, так как в дистрибутивной операции создания рко (например :[RKO].[new#auto_lib]) и клиента произошел commit (причем два раза сначала при создании клиента, потом при создании РКО). | 
 Я так думаю, что vtar имел в виду
  	  | Код: |  	  | declare rCl ref [CLIENT]; begin
 rCl := 234556;
 rCl%delete;
 end;
 | 
 
 
  	  | storysoft пишет: |  	  | Где вообще в обычной дистрибутивной  операции (например создания клиента юрика) прописан commit? Я не нашел. Может где-то в системной части? | 
 
 Я так думаю, что commit прописан там, где его прописал разработчик. В каждом случае индивидуально.
 
 Попробуйте сделать свою транзакцию READ ONLY перед вызовом этой операции.
 |  |  
		|  |  
		| vtar Эксперт
 
 
 Вступление в Клуб: 20.03.2009
 
 | 
			
				|  Чт Июл 23, 2015 11:29   Re: Управление транзакциями |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | Random пишет: |  	  | Я так думаю, что vtar имел в виду
 | 
 Да, всё верно. Получив ссылки созданных объектов, удалить их , раз сложно или невозможно откатить.
 
 COMMIT я так понимаю, генерится Администратором словаря автоматом при компиляции, если не стоит галка "операция контролирует транзакцию", как то так ?
 |  |  
		|  |  
		| Random Эксперт
 
 
 Вступление в Клуб: 27.06.2011
 
 | 
			
				|  Чт Июл 23, 2015 13:15   Re: Управление транзакциями |   |  
				| Полезность: 1 
 |  
				|  	  | vtar пишет: |  	  | COMMIT я так понимаю, генерится Администратором словаря автоматом при компиляции, если не стоит галка "операция контролирует транзакцию", как то так ? | 
 
 Нет.
 commit не проставляется автоматом нигде в автогенерируемых операциях.
 При вызове операции из ARM Навигатор, после завершения операции выполняется commit - выполняется только в этом случае.
 При вызове операции из прикладного кода никакого commit автоматически не делается. Если только операцию не поправили руками и не вставили commit ручками.
 
 Кстати, возможно, этот признак может помочь.
 Дело в том, что commit в коде транслируется в вызов служебной библиотеки и там может быть проигнорирован.
 Вот что о нём сказано в документации:
 Операция контролирует транзакцию
 
 При установленном признаке любые действия при запущенной операции происходят без Commit. По завершении работы операции произойдет подтверждение либо откат всех изменений.
 
 |  |  
		|  |  
		| storysoft Участник со стажем
 
 
 Вступление в Клуб: 18.07.2014
 
 | 
			
				|  Пт Июл 24, 2015 07:14   Re: Управление транзакциями |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | Random пишет: |  	  | Нет.
 commit не проставляется автоматом нигде в автогенерируемых операциях.
 При вызове операции из ARM Навигатор, после завершения операции выполняется commit - выполняется только в этом случае.
 При вызове операции из прикладного кода никакого commit автоматически не делается. Если только операцию не поправили руками и не вставили commit ручками.
 
 
 | 
 Как тогда обяснить что после вызова из прикладного кода дистрибутивной операции (операцию не правили рукми) ::[RKO_INTERFACE].[INT_RKO_OPEN_001].NEW_DOG удаляется точка отката установленная перед эти вызовом??? Значит внутри есть commit. Хотя мои поиски не увенчались успехом.
 |  |  
		|  |  
		| Random Эксперт
 
 
 Вступление в Клуб: 27.06.2011
 
 | 
			
				|  Пт Июл 24, 2015 08:05   Re: Управление транзакциями |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | storysoft пишет: |  	  | Как тогда обяснить что после вызова из прикладного кода дистрибутивной операции (операцию не правили рукми) ::[RKO_INTERFACE].[INT_RKO_OPEN_001].NEW_DOG удаляется точка отката установленная перед эти вызовом??? Значит внутри есть commit. Хотя мои поиски не увенчались успехом.
 | 
 Да, внутри где-то есть commit;
 READ ONLY-транзакция не подходит для поиска commit, к сожалению.
 *ушёл думать.
 
 
  	  | Код: |  	  | declare
 idClient   number;
 idBS      number;
 idCur      number;
 vPack      varchar2(32767);
 z   number;
 begin
 z := rtl.open;
 -- Инициализация
 select id into idClient from z#cl_priv where rownum <= 1;
 select c_SYS_MAIN_VAL into idCur from z#system;
 select id into idBS from z#PL_USV where c_fintool = idCur and rownum <= 1;
 select package_name into vPack from methods where class_id = 'RKO_INTERFACE' and short_name = 'INT_RKO_OPEN_001';
 
 -- Создаём копии таблиц, чтоб отслеживать создание новых записей в них
 execute immediate 'create table b#rko as select id from z#rko';
 execute immediate 'create table b#client as select id from z#client';
 
 -- Чтоб проверить, откуда идёт транзакция. Если где-то внутри вызываемых процедур есть commit (не автономный), запись откатить не удастся.
 execute immediate 'insert into b#client(id) values(0)';
 
 --   execute immediate 'set transaction read only';
 --   dbms_output.put_line(rtl.open);
 
 -- Поехали!
 execute immediate 'declare begin
 dbms_output.put_line(''new_dog returned ''||'||vPack||'.new_dog('||idClient||', P_ACC_BAL => '||idBS||', P_CONTRACT_CUR => '||idCur||')); end;';
 
 -- выводим разность таблиц
 execute immediate 'begin for i in (select id from z#client minus select id from b#client) loop
 dbms_output.put_line(''Клиент ''||i.id);
 end loop;
 for i in (select id from z#rko minus select id from b#rko) loop
 dbms_output.put_line(''РКО ''||i.id);
 end loop; end;';
 
 -- отслеживаем незафиксированную запись
 execute immediate 'begin for i in (select id from b#client where id = 0) loop
 dbms_output.put_line(''Клиент 0 существует!'');
 end loop;
 end;';
 
 -- Rollback!
 rollback;
 dbms_output.put_line('rollback');
 
 -- Проверяем, что rollback всё вернул на место, как было
 execute immediate 'begin for i in (select id from z#client minus select id from b#client) loop
 dbms_output.put_line(''Клиент ''||i.id);
 end loop;
 for i in (select id from z#rko minus select id from b#rko) loop
 dbms_output.put_line(''РКО ''||i.id);
 end loop; end;';
 
 execute immediate 'begin for i in (select id from b#client where id = 0) loop
 dbms_output.put_line(''Клиент 0 существует!'');
 end loop;
 end;';
 
 -- Удаляем копии таблиц
 execute immediate 'drop table b#rko ';
 execute immediate 'drop table b#client ';
 end;
 
 
 | 
 
 Как видно, до rollback договор есть. Если сделать rollback - он исчезает.
 
 Более того, запись, помещённая в b#client, тоже успешно откатывается!
 
 Последний раз редактировалось: Random (Пн Июл 27, 2015 07:59), всего редактировалось 1 раз
 |  |  
		|  |  
		| storysoft Участник со стажем
 
 
 Вступление в Клуб: 18.07.2014
 
 | 
			
				|  Пт Июл 24, 2015 17:43   Re: Управление транзакциями |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | Random пишет: |  	  |  	  | storysoft пишет: |  	  | Как тогда обяснить что после вызова из прикладного кода дистрибутивной операции (операцию не правили рукми) ::[RKO_INTERFACE].[INT_RKO_OPEN_001].NEW_DOG удаляется точка отката установленная перед эти вызовом??? Значит внутри есть commit. Хотя мои поиски не увенчались успехом.
 | 
 Да, внутри где-то есть commit;
 READ ONLY-транзакция не подходит для поиска commit, к сожалению.
 *ушёл думать.
 
 
  	  | Код: |  	  | declare
 idClient   number;
 idBS      number;
 idCur      number;
 vPack      varchar2(32767);
 z   number;
 begin
 z := rtl.open;
 select id into idClient from z#cl_priv where rownum <= 1;
 select c_SYS_MAIN_VAL into idCur from z#system;
 select id into idBS from z#PL_USV where c_fintool = idCur and rownum <= 1;
 execute immediate 'create table b#rko as select id from z#rko';
 execute immediate 'create table b#client as select id from z#client';
 execute immediate 'insert into b#client(id) values(0)';
 --   execute immediate 'set transaction read only';
 --   dbms_output.put_line(rtl.open);
 select package_name into vPack from methods where class_id = 'RKO_INTERFACE' and short_name = 'INT_RKO_OPEN_001';
 execute immediate 'declare begin
 dbms_output.put_line(''new_dog returned ''||'||vPack||'.new_dog('||idClient||', P_ACC_BAL => '||idBS||', P_CONTRACT_CUR => '||idCur||')); end;';
 
 execute immediate 'begin for i in (select id from z#client minus select id from b#client) loop
 dbms_output.put_line(''Клиент ''||i.id);
 end loop;
 for i in (select id from z#rko minus select id from b#rko) loop
 dbms_output.put_line(''РКО ''||i.id);
 end loop; end;';
 execute immediate 'begin for i in (select id from b#client where id = 0) loop
 dbms_output.put_line(''Клиент 0 существует!'');
 end loop;
 end;';
 rollback;
 dbms_output.put_line('rollback');
 execute immediate 'begin for i in (select id from z#client minus select id from b#client) loop
 dbms_output.put_line(''Клиент ''||i.id);
 end loop;
 for i in (select id from z#rko minus select id from b#rko) loop
 dbms_output.put_line(''РКО ''||i.id);
 end loop; end;';
 
 execute immediate 'begin for i in (select id from b#client where id = 0) loop
 dbms_output.put_line(''Клиент 0 существует!'');
 end loop;
 end;';
 
 execute immediate 'drop table b#rko ';
 execute immediate 'drop table b#client ';
 end;
 
 
 | 
 
 Как видно, до rollback договор есть. Если сделать rollback - он исчезает.
 
 Более того, запись, помещённая в b#client, тоже успешно откатывается!
 | 
 
 Совсем запутался, если в операции ::[RKO_INTERFACE].[INT_RKO_OPEN_001].NEW_DOG есть  commit  то как rollback откатил??
 |  |  
		|  |  
		| Random Эксперт
 
 
 Вступление в Клуб: 27.06.2011
 
 | 
			
				|  Пн Июл 27, 2015 07:54   Re: Управление транзакциями |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | storysoft пишет: |  	  | Совсем запутался, если в операции ::[RKO_INTERFACE].[INT_RKO_OPEN_001].NEW_DOG есть  commit  то как rollback откатил?? | 
 
 Я не уверен, что он есть, но точно, что Вы запутались.
 |  |  
		|  |  
		| storysoft Участник со стажем
 
 
 Вступление в Клуб: 18.07.2014
 
 | 
			
				|  Пн Июл 27, 2015 12:15   Re: Управление транзакциями |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | Random пишет: |  	  |  	  | storysoft пишет: |  	  | Совсем запутался, если в операции ::[RKO_INTERFACE].[INT_RKO_OPEN_001].NEW_DOG есть  commit  то как rollback откатил?? | 
 
 Я не уверен, что он есть, но точно, что Вы запутались.
 | 
 
 В одном я 100% уверен: точка отката установленная через &sp(a#01)
 "исчезает" после ::[RKO_INTERFACE].[INT_RKO_OPEN_001].NEW_DOG.
 
 На клманду &rb(a#01) получаю ошибку (точка отката 'SP4151697142A$1' никогда не устанавливалась в этом сеансе или является недействительной).
 
 Может это связано с особенностью реализации в ЦФТ.
 Что вообще делают процедуры?
 cache_mgr.cache_set_savepoint ('SP9455837668A#01');
 cache_mgr.cache_rollback('SP9455837668A#01');
 |  |  
		|  |  
		| Random Эксперт
 
 
 Вступление в Клуб: 27.06.2011
 
 | 
			
				|  Пн Июл 27, 2015 12:28   Re: Управление транзакциями |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | storysoft пишет: |  	  |  	  | Random пишет: |  	  |  	  | storysoft пишет: |  	  | Совсем запутался, если в операции ::[RKO_INTERFACE].[INT_RKO_OPEN_001].NEW_DOG есть  commit  то как rollback откатил?? | 
 
 Я не уверен, что он есть, но точно, что Вы запутались.
 | 
 
 В одном я 100% уверен: точка отката установленная через &sp(a#01)
 "исчезает" после ::[RKO_INTERFACE].[INT_RKO_OPEN_001].NEW_DOG.
 
 На клманду &rb(a#01) получаю ошибку (точка отката 'SP4151697142A$1' никогда не устанавливалась в этом сеансе или является недействительной).
 
 Может это связано с особенностью реализации в ЦФТ.
 Что вообще делают процедуры?
 cache_mgr.cache_set_savepoint ('SP9455837668A#01');
 cache_mgr.cache_rollback('SP9455837668A#01');
 | 
 Ни пакет cache_mgr, ни cache_service не являются заврапленными и Вы легко можете посмотреть, что же они делают.
 |  |  
		|  |  
		| timochev Эксперт
 
 
 Вступление в Клуб: 02.07.2007
 
 | 
			
				|  Пн Июл 27, 2015 14:31   Re: Управление транзакциями |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | storysoft пишет: |  	  | В одном я 100% уверен: точка отката установленная через &sp(a#01)
 "исчезает" после ::[RKO_INTERFACE].[INT_RKO_OPEN_001].NEW_DOG.
 
 | 
 Текст процедуры - в студию.
 В Вашей процедуре случайно нет DDL, как в примере у Random?
 
  	  | Цитата: |  	  | Oracle Database issues an implicit COMMIT under the following circumstances: Before any syntactically valid data definition language (DDL) statement, even if the statement results in an error
 After any data definition language (DDL) statement that completes without an error
 
 | 
 |  |  
		|  |  
		|  |  
  
	| 
 
 | Вы не можете начинать темы Вы не можете отвечать на сообщения
 Вы не можете редактировать свои сообщения
 Вы не можете удалять свои сообщения
 Вы не можете голосовать в опросах
 
 |  |