У меня есть приведенная ниже процедура, в которой есть прагма-предложение автономной_транзакции. Теперь эта процедура вызывается в коде Java после проверки пришедшей бизнес-логики. После выполнения этого процесса он начинается с некоторых материалов Java...
create or replace procedure UPDATE_INSTRUMENT
is
pragma autonomous_transaction;
begin
begin
update abc
set AUTHSTATUS = p_AUTHSTATUS,
STATUS = p_STATUS,
USERID = p_USERID,
LASTUPDATED = TO_DATE(p_LASTUPDATED, 'DD/MM/YYYY'),
USERDATETIME = TO_DATE(p_USERDATETIME, 'DD/MM/YYYY')
where TRANSACNO = p_TRANSACNO;
commit;
end;
begin
update xyz
set AUTHSTATUS = p_AUTHSTATUS,
USERID = p_USERID,
AUTHDATE = TO_DATE(SYSDATE, 'DD/MM/YYYY'),
LASTUPDATED = TO_DATE(SYSDATE, 'DD/MM/YYYY'),
where TRANSACNO = p_TRANSACNO;
commit;
end;
end UPDATE_INSTRUMENT;
Таблица «xyz» имеет три триггера, из которых 1 — «Вставка», а 2 — «Перед обновлением».
PN: - Таблица «xyz» нигде не обновляется и не блокируется перед вызовом этой процедуры.
Я получаю следующие ошибки.
ORA-00060: обнаружена взаимоблокировка при ожидании ресурса
ORA-06512: в "ADTTRG_xyz", строка 277.
ORA-04088: ошибка при выполнении триггера «ADTTRG_xyz»
Таблица abc обновляется правильно, но не удается обновить таблицу xyz.
Пожалуйста, объясните, почему возникает этот тупик.
ORA-06512: at "ADTTRG_xyz", line 277
Что находится вокруг этой строки в триггере? Вот в чем подсказка.. - person pOrinG   schedule 18.12.2017commit
внутри триггера (или внутри процедуры) ради целостности транзакции. - person Barbaros Özhan   schedule 18.12.2017TO_DATE(SYSDATE, 'DD/MM/YYYY')
это ошибка, потому чтоsysdate
уже является датой, аto_date()
принимает только строку. Если вашnls_date_format
имеет двузначный год, вы потеряете столетие и получите год 0017. Возможно, целью былоtrunc(sysdate)
. - person William Robertson   schedule 18.12.2017begin
/end
ничего не делают и могут быть удалены. Я считаю, что лишний беспорядок может скрыть проблемы, затрудняя просмотр реальной структуры кода. И вам действительно нуженcommit
на полпути? Обычно имеет смысл позволить обеим операциям завершиться успешно или потерпеть неудачу вместе. - person William Robertson   schedule 18.12.2017