stophyeon 2024. 4. 20. 16:21
728x90

동시성 이란

동시성이란 공유 자원에 다수의 트래픽이 접근하는 것을 말합니다.
DB의 관점으로 말해보면 공유 자원은 DB를 뜻하고, 다수의 트래픽은 트랜잭션을 말합니다.
즉, 여러 사용자가 하나의 DB Tuple에 접근했을 때 발생하는 문제를 동시성 문제라고 합니다.

 

동시성 문제 예시

동시성 문제는 백엔드 개발자에게 중요한 이슈입니다.
예를 들어 3명의 사용자가 재고가 30개인 상품을 주문하는데 첫번째 사용자가 15개, 두번째 사용자가 15개 , 3번째 사용자가 10개를 주문한다고 가정했을 때 3번째 사용자는 주문이 취소되어야합니다.
사용자가 주문을 하는 행위를 Query문으로 생각해본다면 주문한 상품을 조회하는 Select문과 상품의 개수를 차감하는 Update문으로 이뤄줘있습니다.
하지만 동시성 문제를 고려하지 않고 개발을 했다면 어떻게 될까요
아래 코드는 상품의 가격을 수정하는 쿼리문과 해당 상품의 가격을 조회하는 쿼리문을 실행하는 두 개의 트랜잭션을 실행한다면 2번째 트랜잭션에서 조회하는 상품의 가격은 수정을 한 가격이 조회되는지 확인해 보겠습니다.

 

실제 DB를 테스트하는

 

해당 테스트 코드의 결과는 false입니다. 쿼리문을 보면 update 쿼리문이 가장 나중에 실행되기 때문에 2번째 트랜잭션의 select문이 조회하는 상품의 가격은 update되지않는 가격인 3000입니다.
이렇게 된다면 아직 조회한 상품의 가격과 실제 DB의 상품의 가격 데이터 정합성이 어긋나게 됩니다. 

 

Lock이란

동시성 문제를 해결할 수 있는 방법으로는 대표적으로 Lock을 사용하는 것입니다.
Lock이란 트랜잭션 처리의 순차성을 보장하기위한 방법입니다.
트랜잭션 중 update문을 우선적으로 처리할지와 같은 것을 정하는 것입니다.
다음 글에서 Lock의 종류와 사용방법을 알아보겠습니다.