동시성 제어
만약 쇼핑몰을 운영하는데 100개의 한정상품을 판다고 해보자.
이때 만약 동시에 1000명의 사람이 구매를 한다고 하면 어떻게 해야할까?
이런 동시성 문제에 대비하여 트랜잭션 관리와 동시성제어를 수행해야 한다.
우선 작업을 트랜잭션으로 묶어서 처리해야, 중간에 구매하다가 취소되더라고 큰 문제가 생기지 않을 것이다.
스프링의 경우에
@Transactional 어노테이션을 사용하여 트랜잭션관리가 가능하다.
@Synchronized 어노테이션을 사용하여 메소드에 동기화를 적용하거나,
스프링의 AOP(Aspect-Oriented Programming)를 사용하여 메소드 호출 전후에 동시성 관련 작업을 수행할 수 있다.
이렇게 기본적으로 사용하는 트랜잭션 이외의 기법들은 다음과 같은 것들이 있다.
1.Lock(락) :
동시성 제어 알고리즘 중에 하나이다.
특정 자원에 대한 접근을 동시에 하나의 스레드만이(혹은 개발자가 정한 숫자만큼) 허용하는 동시성 제어 메커니즘이다.
공유자원에 접근하기 전에 해당 자원에 대한 락을 획득하고, 사용이 끝나면 락을 해제한다.
락은 경쟁조건을 방지하여 데이터 일관성을 유지하며, 트랜잭션의 원자성을 보장한다.
공유자원에 대한 접근제한으로 인하여, 시스템의 성능 저하 및 데드락과 같은 문제가 발생할 수 있다.
2.MVCC(Multi-Version Concurrency Control) :
MVCC는 DB에서 여러 트랜잭션이 동시에 실행 될 때, 데이터의 일관성을 유지하기 위한 방법이다.
각 트랜잭션은 읽기 시점에 데이터의 스냅샷을 가져와서 작업을 수행하며, 데이터를 수정할 때는 원본 데이터를 변경하지 않고 새로운 버전을 생성한다.
이런 방법을 사용하여 다수의 트랜잭션이 동시에 데이터를 읽고, 쓸 수 있으면, 동시성을 향상시키고 교착상태를 방지한다.
3.OCC(Optimistic Concurrency Control) :
트랜잭션을 실행하기 전에 락을 획득하지 않고, 작업을 수행하며, 트랜잭션이 완료될 때 데이터의 일관성을 확인한다.
데이터 충돌이 발생한 경우 트랜잭션을 다시 실행하거나 롤백한다.