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