03.비관적 Vs 낙관적 동시성 제어

1.비관적 동시성 제어(Pessimistic Concurrency Control)

  • 사용자들이 같은 데이터를 동시에 수정할 것이라고 가정한다.
  • 한 사용자가 데이터를 읽는 시점에 Lock을 걸고 조회 또는 갱신처리가완료될 때까지 이를유지한다.

2.낙관적 동시성 제어 (Optimistic Concurrency Control)

  • 사용자들이 같은 데이터를 동시에 수정하지 않을 것이라고 가정한다.
  • 데이터를 읽을 때는 Lock을 설정하지 않는다. 데이터 를 수정하고자 하는 시점에 앞서 읽은 데이터가 다른 사용자에 의해 변경되었는지를 반드시검사해야한다.

h3.(1)비관적 동시성 제어


select 적립포인트I 방문횟수, 최근방문일시 I 구매실적 from 고객
where 고객변호 :cust num for update;

-- 새로운 적립포인트 계산
update 고객 set 적립포인트 적립포인트 where 고객변호 :cust num

  • select문에 for update를 사용해서 해당 고객 레코드에 Lock을 걸어둔다면 데이터가 잘못 갱신되는 문제를 방지할 수 있다.
  • select 시점에 Lock을 거는 비관적 동시성 제어는 자칫 시스템 동시성을 심각하게 떨어뜨릴 우려가 있다.

for update nowait --> 대 기 없이 Exception(ORA-00054) 을 던짐
for update wait 3 --> 3초 대기 후 Exception(ORA-30006) 을 던짐

1. FOR UPDATE with no option
2. FOR UPDATE NOWAIT(= WAIT 0)
3. FOR UPDATE WAIT integer (0 ~ 4294967295, second)
4. FOR UPDATE OF

h3.(2) 낙관적 동시성 제어


select 적립포인트, 방문횟수, 최근방문일시, 구매실적 into :a , :b, :c , :d
  from 고객
 where 고객 변호 = :cust num;

-- 새로운 적립포인트 계산
update 고객 set
   적립포인트    =: 적립포인트
 where 고객번호      = :cust num
   and 적립포인트    = :a
   and 방문횟수      = :b
   and 최근방문일시  = :c
   ad 구매실적       = :d

if sql%rowcount 0 then
  alert ('다른 사용자에 의해 변경되었습니다.');
end if;