[Oracle] 데이터베이스 Lock 걸리는 이유와 해결 방법

LOCK 이란?

데이터베이스 여러 사용자들이 같은 데이터를 접근하게 된다면 데이터의 무결성일관성을 지키기 위해 Lock이 사용됩니다.

LOCK 걸리는 이유

SELECT test FROM test_table WHERE id = 1;
UPDATE test_table SET counter = <새로운 값> WHERE id = 1;

해당 SQL문으로 예시를 들어서

A고객이 창고에 ID=1인 물건의 내용에 숫자 1을 더 추가하여 2로 변경했습니다.

이에, 해당 하나의 요청만을 본다면 아무런 문제가 없는 반면에

오라클병렬처리가 가능하다는 특징이 있기 때문에 만약, B고객이 해당 데이터가 변경되기전에 Select하게 된다면

해당 값은 이미 1로 보여지고 해당 값을 1을 더 추가하게 된다면 3으로 변경되어야 하지만

데이터를 변경할때 데이터보호를 받아야 하므로 A고객데이터를 변경하는 동안

A고객 이외에는 해당 데이터를 변경할 수 없도록 LOCK을 걸어서 보호해야만 합니다.

DB Lock이란

  1. A고객데이터A에 대해 검색합니다.
  2. 데이터A가 조회됩니다.
  3. B고객데이터A에 대해 검색합니다.
  4. 데이터 값이 아무런 변경이 없기때문에 데이터A 값이 ②번에 조회된 값과 똑같이 조회됩니다.
  5. A고객이 테이블값을 기존 1에서 2로 변경 합니다.
  6. B고객도 동시에 테이블값이 기존1이기에 2로 변경합니다.

👉 이에 해당 데이터무결성일관성을 지키고자 데이터베이스에 자동으로 Lock걸리게 되는 반면에, Lock이 걸림으로써 작업이 불가할 수 도 있습니다.

DeadLock 이란?

서로가 상대방이 보유하고 있는 Lock을 기다리느라 영원히 작업 처리를 진행할 수 없는 상태를 뜻합니다.

그리하여, 작업처리가 안된다면 DeadLock을 의심할 수 있고 추가적으로

테이블 Lock을 걸고 싶은지 또는 Lock이 걸렸는지 아니면 Lock 테이블 조회와 해제는 아래에 설명드리겠습니다.

오라클 테이블 Lock

테이블 Lock 거는법

LOCK TABLE 테이블명 IN EXCLUSIVE MODE;

Lock 걸린 테이블 확인

select * from v$locked_object
where oracle_username = '사용자명';

Lock 걸려있는 테이블 갯수 확인

select count(*) from v$locked_object vo , dba_objects do 
where vo.object_id = do.object_id;

Lock 걸린 세션 확인

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

Lock 걸린 테이블명을 알고있는경우

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='테이블명'

Lock 걸린 세션 해제 방법

alter system kill session '위에서 확인 된 sid, serial#';
ex) alter system kill session '592, 2913';

 

Leave a Comment