Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите найти Commit  [new]
vr-frost
Member

Откуда:
Сообщений: 64
Есть процедура, в ней 100500 вложенных процедур триггеры и прочие прелести. Где-то внутри явно есть commit, т.к. при сбоях бывает частичная фиксация данных. Как быстрее/проще это дело отследить?
20 ноя 14, 08:52    [16876019]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти Commit  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18484
Запретить его нахрен
см. ALTER SESSION
20 ноя 14, 09:02    [16876057]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти Commit  [new]
кит северных морей
Member

Откуда: krsk / nyc / krsk
Сообщений: 881
vr-frost,

навскидку.

можно рекурсивно обойти dba_dependencies от исходной процедуры (если внутри нет вызовов через dsql) и по списку полученных объектов проверить dba_source.
можно включить sql trace, найти commit в сыром trace-файле, посмотреть, что было вокруг него, и попытаться понять, где именно.

еще есть вариант что процедура делает коммит неявно - через DDL. это уже можно поймать DDL-триггером.
20 ноя 14, 09:05    [16876073]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти Commit  [new]
123йй
Member

Откуда:
Сообщений: 1637
vr-frost,

и искать *_dependencies -> *_source/views ...
20 ноя 14, 09:07    [16876086]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти Commit  [new]
vr-frost
Member

Откуда:
Сообщений: 64
Вячеслав Любомудров,
Нашел DISABLE COMMIT IN PROCEDURE
это будет касаться и всех вызываемых процедур?
на процедуры с автономными транзакциями не повлияет?
20 ноя 14, 09:09    [16876093]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти Commit  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18484
Ну попробуй, в чем проблема
tst> create procedure p1 as
  2  lh varchar2(128);
  3  begin sys.dbms_lock.allocate_unique('test', lh);
  4  end;
  5  /

Procedure created.

tst> alter session disable commit in procedure;

Session altered.

tst> exec p1
BEGIN p1; END;

*
ERROR at line 1:
ORA-00034: cannot COMMIT in current PL/SQL session
ORA-06512: at "SYS.DBMS_LOCK", line 254
ORA-06512: at "U1.P1", line 3
ORA-06512: at line 1
20 ноя 14, 09:22    [16876135]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти Commit  [new]
vr-frost
Member

Откуда:
Сообщений: 64
Вячеслав Любомудров, это я просто не правильно понял принцип работы c DISABLE COMMIT IN PROCEDURE
спасибо за помощь, пришлось повозиться с автономными транзакциями, т.к. на их коммиты тоже ругается, но в целом можно найти то, что нужно!
Внимание привлекли вот эти строчки:
ORA-00034: в текущем сеансе PL/SQL  COMMIT невозможно
ORA-06512: на  "SYS.DBMS_LOCK", line 250
20 ноя 14, 10:29    [16876545]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти Commit  [new]
vr-frost
Member

Откуда:
Сообщений: 64
кит северных морей
vr-frost,

навскидку.

можно рекурсивно обойти dba_dependencies от исходной процедуры (если внутри нет вызовов через dsql) и по списку полученных объектов проверить dba_source.
можно включить sql trace, найти commit в сыром trace-файле, посмотреть, что было вокруг него, и попытаться понять, где именно.

еще есть вариант что процедура делает коммит неявно - через DDL. это уже можно поймать DDL-триггером.


Я наверно что-то не так делаю

select *
from ALL_DEPENDENCIES
connect by
REFERENCED_NAME = prior NAME
start with
NAME = 'моя_процедура'

выдает: ORA-01436: цикл CONNECT BY в данных пользователя
20 ноя 14, 10:33    [16876572]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти Commit  [new]
vr-frost
Member

Откуда:
Сообщений: 64
Правильно ли я понимаю, что dbms_lock.allocate_unique коммитит транзакцию?
20 ноя 14, 11:53    [16877270]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти Commit  [new]
vr-frost
Member

Откуда:
Сообщений: 64
Ладно, тему можно закрывать, всё понятно, всем спасибо!
20 ноя 14, 11:55    [16877292]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти Commit  [new]
Elic
Member

Откуда:
Сообщений: 29979
vr-frost
Есть процедура, в ней 100500 вложенных процедур триггеры и прочие прелести. Где-то внутри явно есть commit, т.к. при сбоях бывает частичная фиксация данных. Как быстрее/проще это дело отследить?
  • deffered constraint
  • constraint on MV refresh on commit
  • 20 ноя 14, 13:36    [16878230]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти Commit  [new]
    vr-frost
    Member

    Откуда:
    Сообщений: 64
    Elic
  • deffered constraint
  • constraint on MV refresh on commit

  • Прошу прощения, но я не очень понял что вы хотели этим сказать
    23 ноя 14, 08:47    [16891516]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти Commit  [new]
    Elic
    Member

    Откуда:
    Сообщений: 29979
    vr-frost
    но я не очень понял что вы хотели этим сказать
    Эти ограничения выстреливают в момент commit-а.
    23 ноя 14, 09:27    [16891543]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти Commit  [new]
    vr-frost
    Member

    Откуда:
    Сообщений: 64
    Elic,
    т.е. создаем материализованное представление, из тех таблиц, которые нужно проверить после окончания процедуры.
    На нужные поля вешается ограничение, которое будет срабатывать только во время фиксации транзакции.
    Надеюсь я правильно понял?
    23 ноя 14, 10:10    [16891576]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти Commit  [new]
    Elic
    Member

    Откуда:
    Сообщений: 29979
    vr-frost
    Надеюсь я правильно понял?
    Нет. Создаём левый объект с ограничением. Заполняем его нарушающей строчкой. И ждём.
    23 ноя 14, 11:07    [16891651]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти Commit  [new]
    vr-frost
    Member

    Откуда:
    Сообщений: 64
    Elic,
    Спасибо! Проблему я уже решил, но ваш метод возьму на заметку.
    При поиске он удобнее "alter session disable commit in procedure" за счет отсутствия ложных срабатываний на автономных транзакциях.
    23 ноя 14, 13:45    [16891843]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти Commit  [new]
    new_one
    Member

    Откуда:
    Сообщений: 4443
    Оба подхода хороши
    Спасибо за науку
    23 ноя 14, 22:19    [16893453]     Ответить | Цитировать Сообщить модератору
    Все форумы / Oracle Ответить