欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解决同一程序在并行同时调用时,出现资源等待错误-使用DBMS_LOCK.sleep

程序员文章站 2022-05-03 11:52:01
解决同一程序被并行同时调用时,出现资源等待错误问题。 使用DBMS_LOCK.sleep (10); PROCEDURE prc_lock_test(v_engine_id in varchar, v_flag_desc in varchar, v_sysdate in varchar, exitc ......

 

解决同一程序被并行同时调用时,出现资源等待错误问题。 使用dbms_lock.sleep (10);

procedure prc_lock_test(v_engine_id in varchar,
v_flag_desc in varchar,
v_sysdate in varchar,
exitcode out number) as
l_proc_name varchar2(100) := 'prc_lock_test';
v_p_name number(2);
v_status varchar2(20);
v_cou number(2);
logger logger_factory := logger_factory;
begin
exitcode := -20099;
logger.info(l_proc_name || ',start');

select count (1)
into v_cou
from z_con_status
where proc_name = 'prc_lock_test';

if v_cou = 0 then
insert into z_con_status
(proc_name, status, sys_creation_date)
values
('prc_lock_test', 'start', sysdate);
commit;

logger.info(l_proc_name || ',sysdate1:'||to_char(sysdate,'yyyyhh24miss'));
else
loop
select status
into v_status
from z_con_status
where proc_name = 'prc_lock_test';

exit when v_status = 'end';

if v_status = 'start' then
dbms_lock.sleep (10);
logger.info(l_proc_name || ',lock sysdate2:'||to_char(sysdate,'yyyyhh24miss'));
end if;

end loop;

end if;

update z_con_status
set status = 'start', sys_creation_date = sysdate
where proc_name = 'prc_lock_test';
commit;

/*keep bak table for one month */
v_p_name := to_number(to_char(sysdate + 1, 'dd'));

execute immediate 'alter table bak_z_productionorders truncate partition p_' ||
v_p_name || ' update indexes';

execute immediate 'alter table bak_z_productionorders_bom truncate partition p_' ||
v_p_name || ' update indexes';

update z_con_status
set status = 'end', sys_creation_date = sysdate
where proc_name = 'prc_lock_test';
commit;
logger.info(l_proc_name || ' completed.');
exitcode := 0;
exception
when others then
exitcode := sqlcode;
logger.error;
raise;
end prc_lock_test;