동시성 제어

Article

동시성 제어

동시 요청되는 멀티 트랜잭션에 대한 실행 순서를 제어.

Definition


- 여러 사용자가 동시에 접속 가능한 서비스 환경의 DB에 대한 동시 요청 트랜잭션이 성공적으로 실행될 수 있도록 해야 함.
- 병행제어라고도 함.
- 트랜잭션의 직렬화 수행

Purpose

 
- 순차적 실행을 위한 직렬성을 보장
- 공유도 최대, 응답 시간 최소, 시스템 활동의 최대 보장
- 데이터 무결성/일관성 보장

Methods


1. Locking : 데이터에  lock을 설정하면,  다른 트랜잭션은 해당  데이터에 대한  lock이 해제(unlock)될 때까지 접근/수정/삭제가 불가능.

    1.1.Lock의 종류

        1.1.1. 비관적 락(Pessimistic Lock)
             - Description
                - 실제로 데이터에 Lock을 걸어 정합성을 맞추는 방법
                - 다른 트랜잭션에서는 lock이  해제되기 전에 데이터를 조회할 수 없다
                   - lock 을 가진  thread만 접근이 가능하도록  제어하는 방법
                - row / table  단위로 lock 을 걸어 자원을 선점할 수 있다.
             - 장점
                - 충돌이 자주 예상/발생한다면, rollback 횟수를 줄일 수 있어, 낙관적 락보다 좋은 성능.
                - 자원을 선점하기 때문에  데이터 정합성을 보장.
             - 단점
                - 데이터 자체에 락을 잡기 때문에  동시성이 떨어져 성능저하 발생 가능.
                -  Dead-Lock이 발생할 수 있다
        1.1.2. 낙관적 락(Optimistic Lock)(논리적 락)
             - Description  
               - 실제로 Lock을 이용하지 않고 Version을 이용하여 정합성을 맞누는 방법
               - 먼저 데이터를 read하고 update를 수행할 때, 현재 내가 read한 version이  맞는지 확인하여 update.
             - 단점
                - 업데이트 실패시, 재시도 수행을 개발자가 고려해야 한다.
                   - 내가  read한  version에서  수정사항이 생겼을 경우, application에서  다시 read 후, 작업을 수행하는 rollback 작업을 수행해야  한다.
                - 충돌이 빈번하게 예상/발생하는 경우, rollback처리를  해야하기 때문에 비관적 락이  더 성능이 좋을 수 있다.
        1.1.3. Named Lock
                - Description
                   - 이름을 가진, metadata lock.

2. Transaction 사용
    - DB 연산을 원자적(Atomic)인 작업 단위로 묶어 처리하므로 동시접근에 대한  일관성/동시성 제어를 제공
    - DB 격리 수준(Isolation Level)을 적절히 설정하여 동시성 문제를 조절할 수 있음.
      * 트랜잭션의 특성
         1. 원자성 : 트랜잭션에 포함된 작업은 전부 수행되거나 수행되지 않아야 함
         2. 일관성 : 트랜잭션을 수행하기 전이나 후에 데이터 베이스는 일관되어야 함
         3. 고립성 : 트랜잭션에 다른 트랜잭션이 끼어들어 변경되는 값을 훼손시키지 않아야 함
         4. 지속정 : 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야 함
    
3. Caching 사용
    3.1. Redis Memory Cache
           3.1.1. Lettuce
              - 구현이 간단하다
              - Spring data redis를 이용하면 lettuce가 기본이기 떄문에 별도의 라이브러리를 사용하지 않아도 된다.
              - Spin Lock 방식이기 때문에 동시에 많은 스레드가 lock 획득 대기 상태라면 redis에 부하가 갈 수 있다.
           3.1.2. Redisson
              - 락 획득 재시도를 기본으로 제공한다.
              - pub-sub 방식으로 구현이 되어있기 때문에 lettuce 와 비교했을 때 redis에 부하가 덜 간다.
              - 별도의 라이브러리를 사용해야한다.
              - lock을 라이브러리 차원에서 제공해주기 때문에 사용법을 공부해야 한다.


Dev Jinwon's Share
f
t