오라클 성능 고도화 원리와 해법 I (2016년-2)
비관적 vs. 낙관적 동시성 제어 0 0 4,117

by 구루비 Concurrency 트랜잭션 [2016.11.14]


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;


"구루비 DB 스터디 모임" 에서 2016년에 "오라클 성능 고도화 원리와 해법 I " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3150

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입