(Oracle Oracle) 잠금이 발생한 테이블 찾기

1. DB Lock은 어떤 경우에 획득되나요?

(1) 프로세스를 컴파일할 때 구문 오류가 없어도 컴파일할 수 없습니다.


– 프로시저에서 수행되는 테이블에 잘못된 DB Link를 참조하거나 DB Lock이 걸려 있으면 정상적인 컴파일이 되지 않고 무한대기 상태가 된다.

(2) 참조된 프로세스의 배치가 종료되지 않고 Running 상태인 경우

2. 잠금 생성 테이블을 찾기 위한 쿼리

--1. lock 발생 사용자와 SQL, OBJECT 조회
SELECT DISTINCT X.SEESION_ID, A.SERIAL#, D.OBJECT_NAME, A.MACHINE, A.TERMINAL, A.PROGRAM, B.ADDRESS, B.PIECE, B.SQL_TEXT
  FROM V$LOCKED_OBJECT X, V$SESSION A, V$SQLTEXT B, DBA_OBJECTS D
 WHERE X.SESSION_ID = A.SID
   AND X.OBJECT_ID = D.OBJECT_ID
   AND A.SQL_ADDRESS = B.ADDRESS
ORDER BY B.ADDRESS, B.PIECE;

--2. 해당 테이블에 LOCK 걸렸는지 확인
SELECT A.SID, A.SERIAL#, B.TYPE, C.OBJECT_NAME, SQL_EXEC_START
  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' --TX: 롤백 세그먼트 및 슬롯번호, TM: 테이블/오브젝트ID
   AND C.OBJECT_NAME IN ('MBR_ISSU_CPN') --테이블명
   
-- TX - row lock connection 확인(오라클 세션모니터 기준)

3. 자물쇠는 어떻게 다루나요?

(1) Lock에 의해 생성된 SID를 확인한 후 해당 라인에 대한 Kill Session 수행
(2) ALTER SYSTEM KILL SESSION ‘275,1’;Session_id를 죽이는 명령 입력