우아한 프로그래밍
article thumbnail

1. 문제상황


자 생각해보자,
내가 개발자이고 만약에 100명한정 쿠폰을 다운로드 만들어야하는 상황이다.
과연 어떻게 개발을 할 것인가?

개발환경은 보통 많이 쓰는 스프링 프레임워크와 오라클이라고 가정하자.

보통 웹서버의 서블릿은 멀티쓰레드이기 때문에 동시성에 대한 문제가 발생한다.

한정수량이 1장 남았을때 두개의 쓰래드가 동시에 접근해서 1장 남았다라는 정보를 조회하게 되면 실제로 남은 수량이 -1이 될 수 있는 상황이 올수있다.

그럼 어떻게 해야할까?

첫번째, 자바의 메소드를 동기화 시키는 방법이 있을 수 있다.
이 방법의 단점은 스레드세이프하지만 처리효율이 줄어든다는 단점이 있다.

두번째, 오라클의 For Update를 사용하는 것

내가 여기서 권고하는 방법은 두번째 방법이다.

2. 처리흐름


*3. For Update 옵션 *


FOR UPDATE -> LOCK을 획득할때까지 무한정 기다림
FOR UPDATE NOWAIT -> 기다리지 않고 ORA-00054 던짐
FOR UPDATE WAIT integer (0 ~ 4294967295, second) -> SECOND초 만큼 대기 후 ORA-300006 던짐
FOR UPDATE OF TABLE_A_COLUMN, TABLE_B_COLUMN-> OF 절을 쓰지않으면 JOIN으로 조회된 두테이블 모두에 락이걸린다. 특정 테이블만 락을 걸고싶다면 원하는 테이블의 컬럼명을 명시해준다.

*4. 주의사항 *


For Update는 Where절에 의해 나온 행의 락을 걸기때문에 Rollback, Commit을 하기 전까지는 락에 걸린다. 그렇기 때문에 마지막에 트랜잭션 완료처리를 안해주면
다른 트랜젝션에서 해당행에 접근이 불가능 하기 꼭 완료처리를 해주기 바란다.

profile

우아한 프로그래밍

@자바조아!

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!