select 적립포인트, 방문횟수, 최근방문일시, 구매실적
from 고객
where 고객번호 = :cust_num
for update nowait ;
-- 새로운 적립포인트 계산
update 고객
set 적립포인트 = :적립포인트
where 고객번호 = :cust_num
for update nowait --> 대기없이 Exception(ORA-00054)을 던짐
for update wait 3 --> 3초 대기 후 Exception(ORA-30006)을 던짐
온라인 쇼핑몰 주문처리 트랜젝션 구현 사례
insert into 주문
select :상품코드, :고객ID, :주문일시, :상점번호, ...
from 상품
where 상품코드 = :상품코드
and 가격 = :가격 ; -- 주문을 시작한 시점 가격
if sql%rowcount = 0 then
alert('상품가격이 변경되었습니다.');
end if;
select 적립포인트, 방문횟수, 최근방문일시, 구매실적
into :a, :b, :c, :d
from 고객
where 고객번호 = :cust_num;
-- 새로운 적립포인트 계산
update 고객
set 적립포인트 = :적립포인트
where 고객번호 = :cust_num
and 적립포인트 = :a
and 방문횟수 = :b
and 최근방문일시 = :c
and 구매실적 = :d ;
if sql%rowcount = 0 then
alert('다른 사용자에 의해 변경되었습니다.');
end if;
select 적립포인트, 방문횟수, 최근방문일시, 구매실적, 변경일시
into :a, :b, :c, :d, :mod_dt
from 고객
where 고객번호 = :cust_num;
-- 새로운 적립포인트 계산
select 고객번호
from 고객
where 고객번호 = :cust_num
and 변경일시 = :mod_dt
for update nowait ; -- 다른 트랜젝션에 의해 설정된 Lock 때문에 동시성이 저하되는 것을 예방
update 고객
set 적립포인트 = :적립포인트,
변경일시 = SYSDATE
where 고객번호 = :cust_num
and 변경일시 = :mod_dt ; --> 최종 변경일시가 앞서 읽은 값과 같은지 비교
if sql%rowcount = 0 then
alert('다른 사용자에 의해 변경되었습니다.');
end if;
select 적립포인트, 방문횟수, 최근방문일시, 구매실적, ora_rowscn
into :a, :b, :c, :d, :rowscn
from 고객
where 고객번호 = :cust_num;
-- 새로운 적립포인트 계산
update 고객
set 적립포인트 = :적립포인트,
변경일시 = SYSDATE
where 고객번호 = :cust_num
and ora_rowscn = :rowscn ;
if sql%rowcount = 0 then
alert('다른 사용자에 의해 변경되었습니다.');
end if;
create table t
ROWDEPENDENCIES
nologging
as
select * from scott.emp;