프로그래밍

프로그래밍

CATS: MySQL은 락 점유 순서를 어떻게 결정할까?

'페스타고' 서비스에서 선착순 티켓팅 기능을 개발하며 궁금증이 생겼다. X-lock은 요청 순서대로 부여될까? 즉, 트랜잭션 A, B, C가 동일한 자원에 대해 순차적으로 락을 대기하면, 그 순서대로 락을 획득할까? 선착순 티켓팅이 제대로 작동하려면, 먼저 대기열에 등록된 트랜잭션이 먼저 락을 획득하는 것이 보장되어야 한다. 이를 확인하기 위해 MySQL의 '트랜잭션 스케줄링 기법'에 대해 알아보았다. 트랜잭션 스케줄링 기법이란? 트랜잭션 스케줄링은 데이터베이스 시스템에서 여러 트랜잭션이 동시에 실행될 때 이들의 실행 순서를 결정하는 방법이다. 여러 트랜잭션이 동일한 자원에 대한 락을 대기하는 경우, 어떤 트랜잭션이 먼저 락을 할당받아야 할까? 바로 트랜잭션 스케줄링이 트랜잭션이 어떤 순서로 데이터에 접..

프로그래밍

AOP 및 @Retryable를 활용한 낙관적 락 재시도

우아한테크코스 기술블로그 '테코블'의 선착순 티켓 예매의 동시성 문제: 잠금으로 안전하게 처리하기 포스트에서 낙관적 락 재시도에 대해 다루었는데, 해당 내용을 별개의 포스트로 공유하고자 글을 작성한다. 위 포스트에서는 선착순 티켓 예매 상황에서 발생하는 동시성 문제를 해결하기 위한 다양한 시도 과정을 설명하니 관심이 있으면 읽어보길 추천한다. 낙관적 락이란?락(잠금, Locking)은 데이터가 읽힌 후 사용될 때까지 데이터가 변경되는 것을 방지하기 위한 조치이다. 잠금 전략으로는 여러 트랜잭션 간 충돌이 일어나지 않을 것이라 가정하는 낙관적 락(Optimistic Lock) , 여러 트랜잭션 간 충돌이 일어날 것이라 가정하는 비관적 락(Pessimistic Lock) 이 있다. 낙관적 락은 실제로 DB에..

프로그래밍

[Spring] REQUIRES_NEW와 데드락 위험성

Requires_new is king of side effects. c.c) spring-framework 이슈 “REQUIRES_NEW는 부작용 대장이다.”라는 말에는 그 이유가 있다. REQUIRES_NEW 전파 속성은 새로운 트랜잭션을 시작하는 기능을 가지며, 그로 인해 데드락 발생의 위험성이 증가한다. 이미 실행 중인 트랜잭션 내에서 이 전파속성을 가진 메서드를 호출하면 새로운 트랜잭션이 시작된다. 이 과정에서 커넥션 풀의 리소스가 부족해지면 데드락의 위험이 있다. 데드락의 원리 REQUIRES_NEW는 이미 실행 중인 트랜잭션이 있을 때 새로운 트랜잭션을 시작하는 전파 속성이다. 만약 동시에 많은 요청이 여러 트랜잭션을 시작하려 할 때, 사용 가능한 커넥션 리소스가 부족하게 되면 데드락이 발생한..

프로그래밍

[Spring] Mockito 테스트의 중복 given절 줄이기: lenient를 활용한 유틸리티 클래스

들어가며 어플리케이션 계층의 서비스 테스트 코드를 Mockito를 활용해 작성할 때, 아래와 같이 무수한 given절이 중복적으로 생기곤 한다. 이러한 given절 중 대다수는 테스트를 성공시키기 위한 부분이며, 실제로 검증하고자 하는 부분은 일부일 때가 많다. 테스트를 성공시키기 위한 given절들은 여러 테스트 메서드들에서 중복적으로 선언된다. 이렇게 given절이 많아지면, 해당 테스트 메서드에서 어떤 조건을 검증하려는지 파악하기 어려워진다. 따라서 나는 성공 조건들은 @BeforeEach문으로 분리하고, 실제로 검증하고자 하는 조건만 해당 테스트 메서드에 남기기로 했다. given절을 @BeforeEach문으로 분리하기 우선 메서드 단위로 @Nested class를 구성한 후, 해당 클래스의 @B..

도둑탈을 쓴 애쉬
'프로그래밍' 카테고리의 글 목록