기본 콘텐츠로 건너뛰기

181207 ORACLE:: table lock

ORACLE:: table lock


1. 증상

1) 정상적으로 서버단 개발 (controller, service, dao, sql)
2) 정상적으로 화면단 개발 (nexacro)
3) 기능 작동시 deadlock or memory leak 문제 뱉어냄

2. 원인

1) 쿼리 작업 중 update문 실행 후 commit을 하지 않은 경우
2) table에 lock이 걸린 경우

3. 해결

1) table에 lock이 걸려 있는지 확인
 - lock 걸린 테이블 확인하는 SQL문
SELECT DO.OBJECT_NAME
     , DO.OWNER
     , DO.OBJECT_TYPE
     , DO.OWNER, VO.XIDUSN
     , VO.SESSION_ID
     , VO.LOCKED_MODE
 FROM V$LOCKED_OBJECT VO
    , DBA_OBJECTS DO
 WHERE VO.OBJECT_ID = DO.OBJECT_ID
cs

- 해당 테이블이 lock에 걸렸는지 확인하는 SQL문
SELECT A.SID
     , A.SERIAL#
     , B.TYPE
     , C.OBJECT_NAME
 FROM V$SESSION   A
    , V$LOCK      B
    , DBA_OBJECTS C
 WHERE A.SID = B.SID 
   AND B.ID1 = C.OBJECT_ID
   AND B.TYPE='TM' 
   AND C.OBJECT_NAME IN ('FA_WHTX_HIN')
cs

- lock session 죽이는 SQL문
SELECT A.SID
     , A.SERIAL#
  FROM V$SESSION A
     , V$LOCK B
     , DBA_OBJECTS C
  WHERE A.SID = B.SID
    AND B.ID1 = C.OBJECT_ID
    AND B.TYPE = 'TM'
    AND C.OBJECT_NAME = '세션죽일테이블명'
cs
2) commmit되지 않은 data를 commit을 해서 해결
2-1) rollback을 해서 해결
2-2) DB 연결 차단 후 재접속(clear)
3) lock 세션을 kill하기