2014년 11월 23일 일요일

Oracle - Lock Table

DB Version : Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production

DB 데이터를 처리하는 프로그램이 갑자기 멈추면서 Ora 에러를 뱉을 때가 있다.
Ora 에러 번호는 미처 적지 못했지만 사실 Lock Table 이 문제가 되었을 경우, 꼭 한가지 동일한 Ora 번호가 나오지는 않는다.
DB 운영 환경, 프로그램 처리 순서도 영향을 미침.

문제를 처음 접했을 때, "Ora 번호가 동일하지 않아" 라는.
같이 일하는 사람 말을 듣고 다른 문제도 있는건가라고 생각했는데.
여기서 몇 시간을 삽집.
결론은 Lock Table 이 문제가 되면서 다른 문제도 같이 발생했던 거.
... OMG
유지보수쪽은 프로그램을 개발했던 사람들이 하는 것이 아니라, 유지보수쪽을 담당하는 사람들을 두어 따로 운영하는 것이지만(지금 여기처럼).
솔직히 이직률이 높은 IT에 유지보수의 질적 향상은 무리일지도.

뭐 개발일은 잠시 쉬고 싶어서 유지보수쪽 일을 하고 있지만 이제 유지보수는 선택 안하는게 좋을 것 같다.
아 다른 뭐 좋은 일 없나.
이런저런 생각을 하면서 테이블에 락이 걸렸을 경우, 처리한 순서를 여기다가 남겨놓는다.

우선 락이 걸리는 경우,
1. Parent-Child 관계로 묶인 테이블에서 Child 테이블에 Index가 없는 상황에서 Child 테이블을 수정하게 되면 Parent테이블에 TABLE LEVEL SHARE LOCK이 걸리게 되어서 Parent 테이블에 대한 모든 Update가 금지된다.

2. 블럭의 PCTFREE가 매우 작다면 한 블럭에 여러개의 레코드가 들어 있기 때문에 한 블럭에 과도한 트랜잭션이 들어와서 블럭의 Transaction Layer가 Release 되기를 기다리게 되는 경우도 있다.

3. Transaction을 직접 처리하는 경우 (@Transaction을 사용하지 않고 @Override 를 사용) commit 이나 rollback 하지 않고 바로 빠져 나가는 경우에도 lock 이 발생될 수 있다. 거래가 바로 빠져 나가는 경우는 exception 이 발생했으나 catch 를 제대로 하지 못 한 경우가 흔하다

락을 찾는 방법,
SELECT 
A.SID, 
A.SERIAL#,
A.USERNAME,
A.PROCESS, 
B.OBJECT_NAME,
DECODE(C.LMODE,2,'RS',3,'RX',4,'S',5,'SRX',8,'X','NO') "TABLE LOCK",
DECODE (A.COMMAND,2,'INSERT',3,'SELECT',6,'UPDATE',7,'DELETE',12,'DROP TABLE',26,'LOCK TABLE','UNKNOWN')"SQL",
DECODE (A.LOCKWAIT, NULL,'NO WAIT','WAIT') "STATUS"
FROM V$SESSION A,DBA_OBJECTS B, V$LOCK C
WHERE A.SID=C.SID AND B.OBJECT_ID=C.ID1
AND C.TYPE = 'TM';

락을 해결하는 방법,
   ALTER SYSTEM KILL SESSION 'sid, serial';
  예제)   ALTER SYSTEM KILL SESSION '144,33521'; 
            commit;

결론 : 나는 지금 기분이 안 좋다.

댓글 없음:

댓글 쓰기

대항해시대 조선 랭작

숙련도 획득 방법 선박 건조, 선박 강화, 전용함 추가시 숙련도 획득 모두 동일한 공식 적용 획득 숙련도 공식 기본 획득 숙련도 ≒ int{건조일수 × 현재랭크 × (0.525)} 이벤트 & 아이템 사용...