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