Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

REQUIRES_NEW 사용 시 발생할 수 있는 데드락 대비 #763

Open
swonny opened this issue Dec 5, 2023 · 0 comments
Open

REQUIRES_NEW 사용 시 발생할 수 있는 데드락 대비 #763

swonny opened this issue Dec 5, 2023 · 0 comments
Assignees
Labels
backend 백엔드와 관련된 이슈나 PR에 사용 refactor 기존 기능에 변경이 없는 구현 변경 시 suggestion 코드 변경 사항이 있는 경우 팀원들에게 제안하기 위함

Comments

@swonny
Copy link
Collaborator

swonny commented Dec 5, 2023

🛠️ 설명

상황

현재 LastReadMessageLogEventListener에서는 추가적인 DB 쓰기 작업을 위해 REQUIRES_NEW 전파 속성을 사용하고 있습니다.
따라서 '채팅방 조회'라는 하나의 태스크를 수행하기 위해 두 개의 커넥션이 필요합니다.

HikariCP 위키를 보면 [(전체 쓰레드 수 * 하나의 태스크에서 필요한 커넥션 수 - 1) + 1 개] 공식을 소개합니다.
위의 공식대로 해석해보면 하나의 태스크에서 두 개 이상의 커넥션이 필요한 경우,
전체 스레드 개수 + 1 개 만큼의 커넥션이 유지돼야 데드락이 발생하지 않는다는 것을 알 수 있습니다.
따라서 REQUIRES_NEW를 사용하는 것을 주의해야 합니다.

위의 문제점을 인지한 뒤 리팩토링을 진행하게 되었습니다.

해결 방법

해당 문제를 해결하기 위한 두 가지 해결 방법이 있습니다.

  1. @Async 사용

    • @Async를 사용하더라도 @TransactionalEventListener와 함께 사용하기 때문에 순서는 보장됩니다. 하지만 @Async를 사용함으로써 테스트가 어려워지거나 고려했을 때 사용에 유의해야 합니다.
  2. REQUIES_NEW propagation 사용

    • 위의 공식에 맞춰 커넥션 풀을 조정해주어야 합니다.

현재는 REQUIRES_NEW만 사용하기 때문에 둘 중 하나의 방식으로 개선이 필요하다고 판단해 리팩토링을 진행하게 되었습니다.

✅ 작업할 내용

@Async 또는 커넥션 풀 조정

🙋🏻 참고 자료

No response

⏰ 추정 시간

추후 수정

⏰ 소요 시간

1시간

@swonny swonny added refactor 기존 기능에 변경이 없는 구현 변경 시 backend 백엔드와 관련된 이슈나 PR에 사용 suggestion 코드 변경 사항이 있는 경우 팀원들에게 제안하기 위함 labels Dec 5, 2023
@swonny swonny self-assigned this Dec 5, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend 백엔드와 관련된 이슈나 PR에 사용 refactor 기존 기능에 변경이 없는 구현 변경 시 suggestion 코드 변경 사항이 있는 경우 팀원들에게 제안하기 위함
Projects
Status: No status
Development

No branches or pull requests

1 participant