본문 바로가기
프로그래밍

오라클 잠금 기능

by 탁구치는 개발자 2009. 1. 2.


비관적 잠금

- 해당 행에 잠금을 하여 다른 세션들로부터의 갱신을 막음
- 그 행이 변경되지 않고 남아 있을지 확신할 수 없기 때문에 갱신을 시도하기 전에 그 행에 잠금을 한다.

SELECT EMPNO, ENAME, SAL
  FROM EMP
 WHERE EMPNO = :EMPNO
   AND ENAME = :ENAME
   AND SAL = :SAL
   FOR UPDATE NOWAIT

위의 쿼리문을 1번 세션에서 질의 실행
2번 세션에서 똑같은 쿼리문 실행하면 "ORA-00054: 자원이 사용중이고, NOWAIT가 지정되어 있습니다" 라고 오류가 나온다.
하지만 위의 쿼리문에서 FOR UPDATE NOWAIT문만 제거하고 실행하면 잠금을 설정한 해당 레코드의 검색이 이루어진다.
오라클에서는 행 잠금을 실행해도 다른 세션에서 읽기는 가능하다.

UPDATE EMP
   SET ENAME = :ENAME,
       SAL = :SAL
 WHERE EMPNO = :EMPNO;
 
COMMIT;

이와 같이 행을 매우 안전하게 변경하였다. 다른 사람의 변경 사항을 겹쳐쓰는 경우가 발생하지 않는다.


낙관적 잠금

- 이전 값과 새로운 값을 모두 애플리케이션에서 유지하며 데이터를 갱신할 때 다음과 같은 방법을 사용하는 것이다.

Update table
     set column1 = :new_column1,
          column2 = :new_column2
 where column1 = :old_column1

이 방법은 데이터가 변경되지 않는다고 낙관적으로 예상



 

'프로그래밍' 카테고리의 다른 글

getter, setter 자동 생성 라이브러리 lombok  (0) 2012.10.23
properties 너가 날 엿 먹이는 구나~  (0) 2012.04.14
메인 도메인과 서브 도메인 세션 공유 문제  (0) 2012.04.14
ant를 이용한 ftp 업로드  (0) 2009.04.01
Generic과 Auto-boxing  (1) 2009.03.15
날짜함수  (0) 2009.02.21
자바의 인터페이스  (0) 2009.01.26
BLOB 사용 예제  (0) 2008.12.31