데이터를 엔티티에 저장할 때 예상되는 문제

동시성 이슈 (Concurrency Issues)

두명 이상의 사용자가 동시에 같은 데이터의 삽입 요청을 했을 때 모든 요청에 담긴 데이터가 중복이 없다고 판단되어 동시에 데이터가 삽입되는 현상.

 
이런 상황을 '레이스 컨디션'이라고 합니다. 레이스 컨디션은 두 개 이상의 프로세스나 스레드가 동시에 같은 데이터에 접근하려고 할 때 발생할 수 있습니다.
 

해결방법

Lock

락은 데이터를 보호하고, 다른 트랜잭션이 동시에 같은 데이터를 수정/삽입 하지 못하게 합니다.

하지만 락을 사용하면 다른 트랜잭션이 락이 해제될 때까지 기다려야 하므로 성능 문제가 발생 할 수 있습니다.

  •  [프로그래밍/SQL] - [ SQL ] Lock  
    • 소극적 락(Pessimistic Locking) : 데이터를 처음 읽을 때 락을 걸고 트랜잭션이 끝날 때까지 락을 유지하는 방법입니다.
    • 적극적 락(Optimistic Locking) : 데이터에 버전 번호나 타임스탬프를 추가하여 데이터를 불러온 후 수정된 경우에만 업데이트가 발생하도록 하는 방법입니다.

MVCC (Multi-version Concurrency Control)

MVCC는 여러 트랜잭션이 동시에 같은 데이터에 접근할 수 있게 합니다. 이는 락을 사용하는 것보다 성능이 좋지만, 데이터 중복 문제를 완전히 해결하지는 못합니다.

 
예를 들어, 한 트랜잭션이 데이터를 확인한 후 다른 트랜잭션이 같은 데이터를 추가하고, 첫 번째 트랜잭션이 데이터를 추가하려 할 때 중복이 발생할 수 있습니다.

MVCC는 동시에 여러 트랜잭션이 데이터베이스에 접근할 때 일관성을 유지하면서 동시성을 높이는 기술입니다. 각 트랜잭션은 데이터의 특정 버전을 보게 되며, 실제 데이터를 직접 변경하는 대신 변경 시점의 스냅샷을 참조합니다. 이렇게 하면 여러 트랜잭션이 동시에 같은 데이터를 읽을 수 있습니다.

 

Unique 데코레이션

@Unique() 데코레이션은 데이터베이스 테이블의 특정 컬럼이나 컬럼 조합에 유니크 제약조건을 적용하여, 그 필드에 중복된 값이 저장되지 않도록 합니다.

주의점

  • 데이터베이스가 유니크 제약조건을 위반할 경우, 일반적으로 예외가 발생합니다. 이 예외를 적절히 처리해야 데이터베이스 에러로 인한 프로그램 중단을 방지할 수 있습니다.
  • 모든 데이터베이스와 ORM이 @Unique 주석을 지원하지는 않을 수 있으므로, 사용하기 전에 해당 ORM 또는 프레임워크 문서를 확인해야 합니다.

+ Recent posts