关于ORACLE的阻塞的问题
我负责的系统目前出现了这样一个情况,系统忙的时候,会出现数据库后台有大量ACTIVE会话,经过查看,大部分的会话都是调用后台的存储过程的,而且如果不重启应用,这些会话根本就不会释放,这个时候看服务器的性能又没有特别的异常。
我们分析过,这些存储过程在平常的时候执行都很快,DBA说因为数据库产生了锁,但是我觉得奇怪的时候,其中某一个存过的调用占了1/3的会话数,但这个存过并没有UPDATE或者INSERT任何数据,仅仅是一些简单的查询和函数操作,按道理来说不应该会阻塞或者被其它阻塞的,存过代码如下:
FUNCTION FUNC1(p_OrderType IN VARCHAR2, p_Org IN VARCHAR2)
RETURN VARCHAR2 IS
BEGIN
DECLARE
v_seqNo NUMBER(8);
v_orderNow DATE;
v_orgAbbr VARCHAR2(4);
BEGIN
-- 非法类型判断
IF (p_OrderType NOT IN ('IB', 'OB', 'DB', 'CB', 'EB', 'PC', 'DM', 'LC', 'CK','RK','EK', 'RO', 'RP', 'DN')) THEN
Raise_application_error(-20005, '无效的单据类型,无法生成单据编号!');
END IF;
-- 取得当前日期
v_orderNow := SYSDATE;
SELECT SEQ_ORDER.NEXTVAL INTO v_seqNo FROM dual;
BEGIN
-- 取得用户所在组织的缩写(PS:这张表的数据不大,执行这个SQL是很快的)
SELECT orgabbr
INTO v_orgAbbr
FROM misouprofile
WHERE orgid = p_Org;
EXCEPTION
WHEN OTHERS THEN
Raise_application_error(-20093, '找不到对应的组织缩写');
END;
-- 根据序列以及日期,类型,组织缩写生成流水号
RETURN p_OrderType || v_orgAbbr || to_char(v_orderNow, 'yyyyMMdd') || LPAD(v_seqNo,8,0);
END;
END;
我们做了一个实验,当数据库出现大量ACTIVE的会话的时候,我们在PL/SQL DEV上直接执行上面那个存过,会一直挂起;但是把里面的代码拷贝出来直接执行,就马上执行完了;难道是存过的那个包被锁住了,所以那个时候执行那个包里面的存过会阻塞?
请大侠指点。。。。。