무지를 아는 것이 곧 앎의 시작

트랜잭션 2

RedisTemplate는 @Transactional 안에서 어떻게 동작할까?

최근 사이드 프로젝트를 하며 재밌는 사실을 알게 되어 포스팅을 남겨본다. RedisTemplate를 사용할 때 스프링에서 추상화하여 제공해주는 트랜잭션 기능을 사용하고 싶으면 다음과 같은 세팅을 하면 된다. @Configuration @RequiredArgsConstructor @EnableTransactionManagement public class RedisConfig { //... @Bean public RedisTemplate redisTemplate( final RedisConnectionFactory redisConnectionFactory ) { final RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnecti..

Spring 2023.06.27

DB의 락 기능을 이용해서 동시성 이슈 해결하기 (feat. 우테코 체스미션)

학습 동기 우테코 체스 미션을 하던 도중 한 게임에 대해 동시에 여러 이동 요청이 들어올 시에 발생할 문제점에 대해 피드백 받고 동시성 이슈에 대한 해결법을 찾다 학습. 문제점 상세 설명 체스 DB 구조 체스 미션의 기물 이동 명령은 이동할 기물의 위치와 목적지의 위치를 입력받고 해당 게임의 모든 체스기물을 불러와서 체스 보드를 만든 후에 이동할 수 있는지 도메인 검증을 거친 후 Piece테이블에 game_id와 위치로 조건절 걸고 update 쿼리를 사용하는 방식으로 구현되었다. 만약 동시에 같은 게임에 대해서 이동 명령이 들어온다면 트랜잭션의 독립성 속성에 의해 update 문을 사용하는 두 기물 데이터는 락이 이미 걸려서 뒤에 들어온 트랜잭션이 접근할 수 없지만, 동시에 들어온 두 트랜잭션 작업이 ..

DB 2022.05.24