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을 걸어서 보호해야만 합니다.
- A고객이 데이터A에 대해 검색합니다.
- 데이터A가 조회됩니다.
- B고객이 데이터A에 대해 검색합니다.
- 데이터 값이 아무런 변경이 없기때문에 데이터A 값이 ②번에 조회된 값과 똑같이 조회됩니다.
- A고객이 테이블값을 기존 1에서 2로 변경 합니다.
- 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';