[SSA] 트랜잭션을 새로 만들어서 사용하면 ?

2025. 8. 29. 02:34·SSA/Back

REQUIRES_NEW를 사용하여, 같은 스레드에서 동기적으로 처리

REQUIRES_NEW를 사용해야 하는 이유는 다음과 같습니다.

  1. @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) 사용 시
    • 해당 리스너 메서드는 '트랜잭션은 커밋 되었으나 종료되지 않은 상태'로 호출됨
  2. 즉, 트랜잭션이 커밋 된 이후 해당 리스너 메서드가 동작한다고 해도, 여전히 하나의 트랜잭션에 묶여있는 것(조회 등 가능)
  3. 따라서 해당 리스너 메서드 내에서 트랜잭션 작업이 이어지는 경우
    • 이미 커밋된 트랜잭션 내에서의 변경 작업이기 때문에 재커밋할 수 없이 해당 작업 내용은 사라진다.

 

이를 해결하기 위해서는 새로운 트랜잭션을 만들어줘야 하는데,

이를 위해 해당 리스너 메서드의 트랜잭션 propagation 속성을 REQUIRES_NEW 로 설정해야 합니다.

 

REQUIRES_NEW 사용 시 데드락 문제

하지만 REQUIRES_NEW 를 사용하면,

기존 트랜잭션이 활성화된 상태에서 새로운 트랜잭션이 시작되며,

이로 인해 한 작업 내에서 동시에 두 개의 커넥션을 사용하게 됩니다.

 

 

HikariCP Dead lock에서 벗어나기 (이론편) 에서도 설명하고 있듯, 이런 상황에서는 데드락이 발생할 수 있습니다.

REQUIRES_NEW 사용 시 데드락 테스트에서 테스트를 진행했고, 예상과 같이 데드락이 발생한 것을 확인할 수 있었습니다.

 

 

그렇다면 REQUIRES_NEW 방식은 사용해서는 안 되는 것일까요 ?

→ 그건 아닙니다.

 

데드락이 발생하지 않도록 HikariCP 커넥션 풀 사이즈의 최대 개수를 늘려주면 됩니다.

 

공식은 다음과 같은데 (pool size = Tn x (Cm - 1) + 1) 입니다.

  • Tn : 전체 스레드 개수
  • Cm : 하나의 Task에서 동시에 필요한 Connection 수

그러나 위 공식에서 알 수 있듯이, REQUIRES_NEW를 사용하지 않으면, 현재 서비스상 Task에서 동시에 필요한 Connection 수는 1개이므로, Pool Size의 최소 크기는 1이면 됩니다.

 

그러나 REQUIRES_NEW를 사용하는 순간, 데드락 발생 방지를 위해 필요해지는 최소 커넥션의 수가 (전체 스레드 개수 + 1)이 되어,

최소 201개가 될 것입니다. (톰캣의 기본 쓰레드 풀 사이즈가 200)

 

 

 

'SSA > Back' 카테고리의 다른 글

[SSA] 알림 모듈 구조 개선 및 간단한 동시성 제어 ..  (2) 2025.08.30
[SSA] 새로운 트랜잭션을 만들면 데드락이 발생하는 것을 테스트해 보자  (0) 2025.08.29
[SSA] 500명 알림 발송 6.4초 -> 0.27초, 카프카 컨슈머 병렬 처리 적용기  (3) 2025.08.28
[SSA] 수강 기능 및 알림 기능을 한 곳에서 처리하면 발생할 수 있는 문제  (1) 2025.07.19
[SSA] 서버 SSE 기능 구현  (0) 2025.05.11
'SSA/Back' 카테고리의 다른 글
  • [SSA] 알림 모듈 구조 개선 및 간단한 동시성 제어 ..
  • [SSA] 새로운 트랜잭션을 만들면 데드락이 발생하는 것을 테스트해 보자
  • [SSA] 500명 알림 발송 6.4초 -> 0.27초, 카프카 컨슈머 병렬 처리 적용기
  • [SSA] 수강 기능 및 알림 기능을 한 곳에서 처리하면 발생할 수 있는 문제
하가네
하가네
  • 하가네
    하 렌
    하가네
  • 전체
    오늘
    어제
    • 분류 전체보기 (128) N
      • Computer Science (27)
        • 운영체제 (7)
        • 데이터통신 (10)
        • 자료구조 (4)
        • 논리회로 (0)
        • 확률 및 통계 (0)
        • 데이터베이스 (2)
        • AI소프트웨어 (3)
        • 컴퓨터네트워크 (1)
      • Design (5) N
        • OOP - 객체 지향 프로그래밍 (3) N
        • DDD - 도메인 주도 개발 (데이터베이스 주도 .. (0)
        • EDA - 이벤트 기반 아키텍처 (1)
        • MSA - 마이크로서비스 아키텍처 (0)
        • ADD - AI 주도 개발 (1)
      • Language (2)
        • Java (0)
        • TypeScript (2)
      • Framework (12)
        • Spring (9)
        • NestJS (3)
      • Engine (3)
        • Elasticsearch (1)
        • GraphQL + Apollo Federation (2)
      • Plugin - Extension (1)
        • VS Code (1)
        • IntelliJ (0)
      • Tips (2)
        • 터미널 명령어 (1)
        • 우분투 명령어 에러 (1)
      • SSA (26)
        • Front (1)
        • Back (23)
        • DB (1)
        • 기획 (1)
      • CNU SW 아카데미 (43)
        • 1주차 (5)
        • 2주차 (5)
        • 3주차 (2)
        • 4주차 (1)
        • 5주차 (3)
        • 6주차 (2)
        • 7주차 (0)
        • 8주차 (2)
        • 9주차 (14)
        • 10주차 (0)
        • 11주차 (1)
        • 12주차 (0)
        • 13주차 (2)
        • 14주차 (2)
        • 15주차(최종 프로젝트) (3)
        • 최종 프로젝트 이후 (1)
      • 모각코 (6)
        • 2023 동계 (6)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    프론트엔드/백엔드
    lint-staged
    Husky
    Typescript
    ESLint
    개발자경험(DX)
    아키텍처
    생산성
    DX(DeveloperExperience)
    릴리스엔지니어링
    ci/cd
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.
하가네
[SSA] 트랜잭션을 새로 만들어서 사용하면 ?
상단으로

티스토리툴바