在执行一个JOB时,发现表死锁了。
情况如下:OBJECTNAME:TMP_STUDENT_STUDYSTATUS
        LOCKTYPE:TM
        LOCKMODE:Row-X (SX)
        PROGRAMNAME:ORACLE@USER-DB(J001)
锁的表是TMP_STUDENT_STUDYSTATUS。
执行的JOB所调用的存储过程如下
CREATE OR REPLACE PROCEDURE Psch_Studentstudystatus IS
/**
学员学习状态整理
JOB03
*/
v_num NUMBER;
BEGIN
 BEGIN
    DELETE TMP_STUDENT_STUDYSTATUS;
COMMIT; INSERT INTO TMP_STUDENT_STUDYSTATUS (studentid,schoolyear,studyStatus)
    SELECT studentid ,schoolyear, CASE pass WHEN 1 THEN 'P' WHEN 0 THEN 'Y' ELSE 'N' END AS STUDYSTATUS
FROM (
SELECT t1.studentid ,t1.schoolyear, Getstudentstudyinstance2(t1.studentid,t1.schoolyear) AS pass
FROM PUBSTUDENTCURRENT t1
WHERE t1.registstatus='Y'
);
COMMIT;
UPDATE PUBSTUDENTCURRENT t1
SET t1.studystatus =
(SELECT STUDYSTATUS FROM  TMP_STUDENT_STUDYSTATUS t2 WHERE t1.studentid=t2.studentid AND t1.schoolyear=t2.schoolyear)
WHERE t1.registstatus='Y' ;
COMMIT;
EXCEPTION
     WHEN OTHERS THEN
  ROLLBACK;        RAISE_APPLICATION_ERROR(-20000,'Psch_RANK error! ' || SQLERRM);   RETURN;
END;
END;
/TMP_STUDENT_STUDYSTATUS表只是个临时表,其他地方都没有使用到。为什么在INSERT的时候也会造成锁呢?
请各位赐教了,谢谢

解决方案 »

  1.   


    ,这是锁,但不是死锁看看V$lock和v$session_wait中有什么信息?
      

  2.   

    如果是死锁的话,在alert中会产生ora-00060错误,并且事务会被强行rollback.
      

  3.   

    在哪里产生了TX锁.你debugger一下看看到什么地方hang了吧.为什么造成锁表很难说了,temporary table的话不会有这个情况,所以要你看看V$lock和v$session_wait先.还有就是dba_waiters
    v$locked_object
      

  4.   

    只是锁等待,而不是死锁,死锁oracle回自动处理的!
    解决办法:
    1.尽可能减小事务的大小.
    2.优化你的程序,提高运算速度.
      

  5.   

    LOCKTYPE:TM 
            LOCKMODE:Row-X (SX) 
    ROW锁等待
    可能是INSERT INTO TMP_STUDENT_STUDYSTATUS (studentid,schoolyear,studyStatus) 
        SELECT studentid ,schoolyear, CASE pass WHEN 1 THEN 'P' WHEN 0 THEN 'Y' ELSE 'N' END AS STUDYSTATUS 
    FROM ( 
    SELECT t1.studentid ,t1.schoolyear, Getstudentstudyinstance2(t1.studentid,t1.schoolyear) AS pass 
    FROM PUBSTUDENTCURRENT t1 
    WHERE t1.registstatus='Y' 
    ); 产生...
      

  6.   

    如果楼主insert这里出现了TX,那么你需要检查你的表是否有bitmap index,或者unique index,当然不管怎么样,先V$lock 看看再说.什么模式