[Spring] 동시성 이슈 및 해결 방안

2023. 9. 12. 18:02·Java/Spring

동시성

  • 두 개 이상의 세션이 공통된 자원에 대해 읽고 쓰는 작업을 하는 경우, 발생할 수 있는 문제 

동시성 문제의 2가지 현상

 

일관성 없는 읽기

 

  • 세션 2는 동시에 실행되고 있는 세션 1 때문에, 데이터에 접근하는 시점마다 다른 값을 읽게 됩니다.
  • 이러한 문제는 “불변성”, 복사본을 이용하여 해결, 세션2가 최초로 데이터를 조회하는 경우, 해당 데이터를 복사하고 이후에도 계속 사용하는 것입니다.
  • 하지만, JPA에서는 영속성 컨텍스트에 데이터를 1차 캐시에 캐싱하기 때문에, 일관성 없는읽기에 대한 문제는 없습니다.

 

갱신 손실

  • 세션2에 의해 세션 1의 변경 사항이 무시되는 현상

 

이러한 동시성 문제를 해결하기 위한 방안

 

Optimistic Lock(낙관적 락)

 

  • 자원에 Lock을 걸지 않고 충돌이 발생했을 때, 이를 처리하는 방법
  • 공통된 자원에 @version이라는 어노테이션을 추가하여 구현하고, 만약 초기에 commit한 version과 커밋할 때의 version이 다르다면 update 쿼리가 실패하게 되고 이에 대한 rollback 처리를 수행

 

Pessimistic Lock(비관적 락)

  • DB가 제공하는 lock 기능을 이용해 엔티티를 영속 상태로 올릴 때 부터 다른 세션에서 조회하지 못하도록 Lock을 걸어두는 것
    • Shared Lock(공유락, 다른 트랜잭션에서 읽기만 가능, Exclustiv Lock 적용 불가능)
    • Exclusive Lock(베타락, 다른 트랜잭션에서 읽기, 쓰기 둘 다 불가능, Shard, Exclusive Lock 적용이 불가능)

 

오늘은 동시성 이슈와 해결 방안에 대해 간략하게 알아보았고, 다음 포스팅에서는 Java의 Synchronized, Redis의 Lettuce, Redisson, Optimistic Lock, Pessimistic Lock을 이용하여 해결하는 과정에 대해 예제 코드를 첨부하여 설명드리겠습니다.  

 

 

 

 

 

 

 

 

 

 

<참고 자료>

http://jaynewho.com/post/44

 

동시성 문제 - 비즈니스 애플리케이션 (Part 3) | Jayne.who();

< Back 동시성 문제 - 비즈니스 애플리케이션 (Part 3) web | 07 March 2020 Tags | concurrency architecture enterprise database jpa 시리즈 Part 1 : 동시성 문제 - 일반론 Part 2 : 동시성 문제 - 데이터베이스와 JPA Part 3 :

jaynewho.com

 

저작자표시 비영리 변경금지 (새창열림)

'Java > Spring' 카테고리의 다른 글

[Spring] 계층형 디렉터리, 도메인형 디렉터리 구조  (0) 2023.09.27
[Spring] 재고 시스템으로 알아보는 동시성 이슈 해결 방법  (0) 2023.09.19
[Spring] Spring AOP  (0) 2023.08.15
[Spring] Proxy Pattern, Decorator Pattern  (0) 2023.08.15
[Spring] Template Method Pattern, Strategy Pattern, Template Callback Pattern  (0) 2023.08.09
'Java/Spring' 카테고리의 다른 글
  • [Spring] 계층형 디렉터리, 도메인형 디렉터리 구조
  • [Spring] 재고 시스템으로 알아보는 동시성 이슈 해결 방법
  • [Spring] Spring AOP
  • [Spring] Proxy Pattern, Decorator Pattern
SeungbeomKim
SeungbeomKim
[IT(PS, CS, SW, etc.) 지식 기록] Github : https://github.com/daily1313/
  • SeungbeomKim
    개발 블로그
    SeungbeomKim
  • 전체
    오늘
    어제
    • 분류 전체보기 (383)
      • 일상 (33)
        • 여행 (17)
        • 회고록 (9)
        • 리뷰 (7)
      • PS (138)
        • 그리디 알고리즘[Greedy] (25)
        • 정렬 알고리즘[Sort] (18)
        • 문자열 알고리즘[String] (14)
        • 동적 계획 알고리즘[DP] (17)
        • 깊이 우선 탐색, 너비 우선 탐색[DFS, BFS.. (34)
        • 재귀[Recursion] (2)
        • 백트래킹[Backtracking] (5)
        • 브루트포스 알고리즘[Bruteforce] (16)
        • 자료 구조[Data Structure] (4)
        • 분할 정복 알고리즘[Divide & Conquer.. (3)
      • CS (22)
      • Network (11)
      • Database (8)
        • Elasticsearch (3)
      • Linux (2)
      • JavaScript (4)
        • AngularJS (1)
      • Java (92)
        • Effective Java (5)
        • Java Concept (20)
        • Spring (61)
        • Design Pattern (3)
      • Python (2)
      • Vscode (1)
      • DevOps (43)
        • AWS (27)
        • Git (7)
        • Docker (6)
        • Nginx (1)
      • 자격증 (10)
        • SQL (4)
      • 사이드 프로젝트 (2)
        • MatJido (2)
      • 기타 (9)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 소개
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    컴퓨터구조
    Spring
    Wi-Fi
    BFS
    docker
    이펙티브 자바
    dp
    백트래킹
    일본여행
    dfs
    sqld
    메타코딩
    다이나믹 프로그래밍
    Effective Java
    AWS
    너비 우선 탐색
    정보처리기사 실기
    정보처리기사
    springboot
    정보처리기사 필기
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
SeungbeomKim
[Spring] 동시성 이슈 및 해결 방안
상단으로

티스토리툴바