동시성 이슈(Concurrency Issues)의 제어(제어 목적, 제어 기법, 제어 방식)

nana·2024년 9월 27일
1

개발 지식

목록 보기
2/7

동시성 제어(Concurrency Control)?

동시에 실행되는 여러 개의 트랜잭션이 작업을 성공적으로 마칠 수 있도록 트랜잭션의 실행 순서를 제어하는 기법

동시성 제어의 정의

  • 다중 사용자 환경을 지원하는 데이터 베이스 시스템에서 여러 트랜잭션들이 성공적으로 동시에 실행될 수 있도록 지원하는 기능.
  • 다중 사용자 환경을 지원하는 DB System의 경우 필수적으로 지원해야하는 기능으로 병행제어라고도 한다.
  • 트랜잭션의 직렬화 수행 보장.
  • 스레드는 Stack 영역을 제외한 Data, Code, Heap영역을 공유하는데 Heap영역에 참조 변수들이 load되어 서로 공유된다. 이 때 Heap 영역에 있는 변수들을 여러 스레드가 동시에 접근하게 되어 계산했을 시, 예상하는 결과와 다른 문제가 생길 수 있는데 이를 동시에 접근하여 문제가 생기는 것들을 동시성 문제라고 한다.

동시성 제어의 목적

  • 트랜잭션의 직렬성 보장
  • 공유도 최대, 응답 시간 최소, 시스템 활동의 최대 보장
  • 데이터의 무결성 및 일관성 보장.

동시성 제어 방식 (Concurrency Control Mechanisms)

낙관적 락(Optimistic Lock)

- 데이터가 수정되기 전에 다른 스레드에서 변경이 발생했는지 확인하고, 충돌이 있으면 수정 실패를 처리.
- 예시: **버전 필드(version)**를 사용하여 데이터가 수정될 때 버전이 맞는지 검증. 충돌 발생 시 수정 중단.
  • 장점
    데이터베이스 락을 사용하지 않아 성능상 이점이 있다.
    애플리케이션 레벨에서 충돌을 처리할 수 있다.
  • 단점
    충돌 발생 시 재시도 로직을 직접 구현해야 한다.

비관적 락 (Pessimistic Locking)

- 데이터 수정 전에 다른 스레드가 접근하지 못하도록 잠금을 설정하여 동시성을 제어.
- 예시: 특정 행에 대한 **행 레벨 락(row-level lock)**을 사용하여 해당 데이터가 완전히 안전하게 수정되도록 보장.
  • 데이터베이스 트랜잭션 (Database Transactions):
    - 모든 작업을 트랜잭션 단위로 처리하여, 트랜잭션 내에서 동시성 문제를 해결.
    - ACID 속성을 통해 데이터 일관성을 보장.
    - 예시 : 여러 스레드가 동시에 데이터베이스에 접근할 때, 트랜잭션이 완료되기 전까지 다른 스레드가 수정하지 못하게 함.

  • 장점
    데이터 일관성을 강하게 보장한다.
    충돌 처리 로직이 단순하다.

  • 단점
    동시성이 떨어져 성능 저하가 발생할 수 있다.
    데드락 발생 가능성이 있다.

어떤 락을 선택해야할까?

"낙관적 락 선택 기준"

  • 충돌이 적게 발생하는 경우
  • 높은 동시성이 필요한 경우
  • 짧은 트랜잭션 시간

"비관적 락 선택 기준"

  • 데이터 정합성이 매우 중요한 경우
  • 충돌이 자주 발생하는 경우
  • 긴 트랜잭션 시간

자바의 동시성 제어 기법

  • synchronized : 특정 메서드나 블록에 대해 동시 접근을 제한 하는 가장 기본적인 방법.
  • ReentrantLock : 더 복잡한 잠금 방식을 제공하며, 명시적으로 잠금을 제어할 수 있음. 특히 타임아웃과 인터럽트 기능을 제공.
  • ConcurrentHashMap : 동시성 문제를 해결하기 위해 특별히 설계된 데이터 구조로, 병렬성을 지원하며 여러 스레드가 안전하게 사용할 수 있음.

비동기 처리와 CompletableFuture

  • 비동기 작업을 처리하면서, 특정 시점에 모든 작업이 완료되면 결과를 병합하는 방식.
  • 장점: 논블로킹 방식으로 동작하여 성능을 높일 수 있음.
  • 사용 예시: 여러 요청이 동시에 들어와도 작업이 비동기적으로 처리되고, 필요한 시점에 결과를 합쳐서 처리하는 방식.

Thread & Multi Thread

Thread

  • 프로세스 내에서 실행되는 여러 흐름의 단위.
  • 한 프로세스 내에 여러 스레드가 존재할 수 있다.
  • 스레드는 Stack영역을 제외한 다른 영역을 공유한다. (같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 유지한다.)

Multi Thread

  • 멀티 스레드란 한 프로세스를 여러개의 스레드로 구성하고 각 스레드로 하여금 한 작업(task)를 처리하도록 하는 것.
  • 한 프로세스에서 여러 작업을 병렬로 처리하는 것.
  • 멀티 스레드에서는 한 프로세스 내에 여러개의 스레드가 있고, 각 스레드들은 Stack영역을 제외한 Data, Code, Heap 영역을 공유한다.

참조 :
[ 기술면접 / 데이터베이스 ] 동시성 제어( Concurrency Control )
Java 동시성 제어 - 멀티스레드, Syncronized, volatile, Atomic

profile
BackEnd Developer, 기록의 힘을 믿습니다.

0개의 댓글