티스토리 뷰
비관적 동시성 제어(Pessimistic Concurrency Control)
- 사용자들이 같은 데이터를 동시에 수정할 것이라고 가정
- 한 사용자가 데이터를 읽는 시점에 Lock을 걸고 조회 또는 갱신처리가 완료될 때까지 이를 유지한다.
- Locking은 첫번째 사용자가 트랜잭션을 완료하기 전까지 다른 사용자들이 그 데이터를 수정할 수 없게 만들기 때문에 비관적 동시성 제어를 잘못 사용하면 동시성을 저해받게 된다. 잘 사용하면 동시성 증가시킴.
구현 예시
select * from 고객
where 고객번호 = :cstno for update;
--새로운 포인트 계산
update 고객 set 포인트 = :포인트 where 고객번호 = :cstno
for update nowait --> 대기없이 Exception(ORA-00054)
for update wait 3 --> 3초 대기 후 Exception(ORA-30006)
낙관적 동시성 제어(Optimistic Concurrency Control)
- 사용자들이 같은 데이터를 동시에 수정하지 않을 것이라고 가정
- 데이터를 읽을 때는 Lock을 설정하지 않는다. 읽는 시점에는 Lock을 사용하지 않지만 갱신시점에는 다른 사용자에 의해 변경된 데이터인지 검사한다.
구현 예시
select 포인트, 방문횟수, 최근방문일시, 구매실적 into :a, :b, :c, :d
from 고객
where 고객번호 = :cstno
;
--새로운 포인트 계산
update 고객 set 포인트 = :포인트
where 고객번호 = :cstno
and 포인트 = :a
and 방문횟수 = :b
and 최근방문일시 = :c
and 구매실적 = :d;
if sql%rowcount = 0 then
alert('다른 사용자에 의해 변경되었습니다.');
end if;
'DB' 카테고리의 다른 글
[Oracle] 동시성 구현 사례 (0) | 2024.06.10 |
---|---|
[Oracle]트랜잭션 수준 읽기 일관성 (0) | 2024.06.09 |
[Oracle]오라클 인덱스(Oracle Index) (0) | 2023.04.03 |
[Oracle] 알짜 SQL 기본 상식 10가지 (0) | 2023.03.19 |
[오라클] 계층형 쿼리(START WITH CONNECT BY) (0) | 2023.01.30 |
공지사항