Oracle2009. 9. 3. 10:56
대처1



Table Lock 걸렸을 때 처리하는 법 (ORA-00054) 오라클/기타DB

2007/04/26 14:26

복사 http://blog.naver.com/xacti/80037278371

ORA-00054 발생했을때 처리하는 방법.

 

여러가지 문제가 있을수 있지만...

Commit을 안했다던지... 무슨 작업중이라던지... 이유는 다양합니다.

Truncate같은 명령은... ORA-00054라는 에러라도 출력하지만...

DML(Delete) 문장 실행시 그냥 멈쳐버립니다.ㅡㅡ;;;

오라클 재시작!!! 하면 간다하게 처리됩니다.^^;

하지만 DB 특성상 재시작 할수 없는 경우가 많죠~

그때는 Lock걸린 세션을 찾아서.. Kill해주면 됩니다.

다음 명령어로 검색.

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='TABLE_NAME';

   SID    SERIAL#
------- ----------

  2715      40427


Kill은 이렇게...

alter system kill session '2715,40427';

[출처] Table Lock 걸렸을 때 처리하는 법 (ORA-00054)|작성자 핑크



[oracle]table lock 종류 Oracle10g

2008/01/29 19:33

복사 http://blog.naver.com/dshnaldo/100046855801

제발 잊지말자 이거 천천히 읽으면 이해되요ㅠㅠ

 

User가 INSERT, DELETE, UDATE, SELECT .. FROM .. FOR UPDATE OF 문장을 실행하면,
변경되는 ROW에 대한 ROW LOCK과 TABLE에 대한 TABLE LOCK이 발생.

ROW LOCK (TX)
INSERT INTO … VALUE.. ;,
DELETE FROM …WHERE …;,
UPDATE ..SET ..WHERE ..;,
SELECT .. FROM .. WHERE .. FOR UPDATE OF.. ; 등의 SQL 문장에서,
WHERE 조건에 해당되는 ROW에 대하여 다른 유저들이 변경할 수 없도록 EXCLUSIVE LOCK 이 생긴다.
TX LOCK이 걸린 ROW는 DML 문장을 실행한 유저가 COMMIT이나 ROLLBACK을 할때 까지 걸리므로
다른 유저들이 변경할 수 없다.

TABLE LOCK (TM)
TX LOCK이 걸린 ROW가 저장된 TABLE에 대한 LOCK 이다.
DML SQL 문장을 수행하는 중에,
해당 테이블이 ALTER 나 DROP 되는 것을 방지하기 위해서 TM LOCK을 사용한다.
같은 테이블에서 실행할 수 있는 SQL 문장과 실행할 수 없는 SQL 문장을 구분하기 위해서다.
TM LOCK에는 RS(ROW SHARE), RX(ROW EXCLUSIVE), S(SHARE), SRX(SHARE ROW EXCLUSIVE), X(EXCLUSIVE) 가 있다.

 

RS : ROW SHARE LOCK
table에 lock을 걸려는 transaction이 table안에 lock된 row가 있고
그 row를 변경시키고자 하는 것을 가리킨다.

SELECT .. FROM .. WHERE .. FOR UPDATE OF .. ; 이나
LOCK TABLE .. IN ROW SHARE MODE; 명령에 의해 해당 테이블에는 RS LOCK 이 생긴다.
RS LOCK 이 걸린 테이블에는 RS, RX, S, SRX LOCK 을 걸 수 있고, X LOCK 은 걸 수 없다.

단, SELECT .. FROM FOR UPDATE OF 명령에 의해 WHERE 조건에 걸린 ROW 에 대해서는
TX LOCK 이 생기므로 이 ROW 에 대해서 UPDATE, DELETE 를 실행할때는 테이블에 대해서는
RX LOCK이 생기므로 에러는 안 나지만, COMMIT 이나 ROLLBACK 할때까지 WAITING 을 한다.

SELECT .. FOR UPDATE OF; 문장은 테이블에는 RS LOCK 이므로 에러는 안나지만,
ROW 에 대해서는 TX LOCK 이 걸리므로 WAITING 한다.

 

RX : ROW EXCLUSIVE LOCK
lock이 걸린transaction이 그 table에 있는 row들에 대해
하나 이상의 update를 수행하고자 하는 것을 가리킨다.

UPDATE ..;, INSERT INTO ..;, DELETE FROM ..; 이나
LOCK .. IN ROW EXCLUSIVE MODE ; 명령에 의해 테이블에 걸리는 LOCK 이다.
RX LOCK 도 RS LOCK 과 비슷한 내용이고, 단지 S, SRX, X LOCK 을 걸 수 없다.

 

S : SHARE LOCK
Transaction에 의해서 걸리는 share table lock은 다른 transaction들이
단지, table에 대한 query, SELECT … FOR UPDATE를 이용한 특정 row에 대한
lock, LOCK TABLE … IN SHARE MODE문들을 성공적으로 수행하기 위해서 허용한다.

LOCK .. IN SHARE MODE; 에 의해 테이블에 생긴 LOCK 이다.
S LOCK 은 같은 테이블에 대해서 RS, S LOCK 만 가능하고, RX, SRX, X LOCK 을 걸 수는 없다.
SQL> LOCK TABLE EMP IN SHARE MODE;

 

SRX : SHARE ROW EXCLUSIVE
한 시점에 주어진 table에 대해 하나의 share row exclusive table lock만이 걸릴 수 있다.
transaction에 의해 걸린 share row exclusive table lock은
다른 transaction이 query을 하거나 SELECT … FOR UPDATE로
특정 row를 lock하는 것을 허용하나 table의 갱신은 허용하지 않는다.

LOCK TABLE .. IN SHARE ROW EXCLUSIVE MODE; 에 의해 테이블에 생긴 LOCK 이다.
SRX LOCK 은 같은 테이블에 대해서 RS LOCK 만 가능하고 RX, SRX, S, X, LOCK 을 걸 수 없다.
SQL> LOCK TABLE 사원 IN SHARE ROW EXCLUSIVE MODE;

 

X : EXCLUSIVE
lock을 건 transaction이 table에 대한 access를 exclusive write로 허용하는
table lock의 가장 제한적인모드

LOCK TABLE .. IN EXCLUSIVE MODE; 에 의해 테이블에 생긴 LOCK 이다.
X LOCK 은 같은 테이블에서는 어떠한 LOCK 도 걸 수 없다.
즉, DROP TABLE ..;, ALTER TABLE ..; 등의 DDL 문장에 의해 테이블에 생기는 LOCK 이다.

Posted by Julyus