2

[Java/Spring]선착순 티켓 예매의 동시성 문제: 잠금 없이 처리하기(Feat. 우테코 아티클)

Introduction 예제는 깃허브에 업로드해뒀습니다. 얼마 전, 우테코 블로그에 올라온 한 아티클이 화제였다. 바로 라는 제목의 글이었다. 사내 슬랙 채널에 리드님께서 해당 글을 공유해주셨더라. 그러면서 스레드에 아래와 같은 화두를 던지셨다. 아예 데이터(Ticket 엔티티)에 락을 안 걸고 만들 수 있는 방법은 어떤 게 있을까요? 여기서 전제는 "기존 환경 그대로에서"였다. 즉, 위에 다른 분께서 언급하신 것처럼 메시지큐를 사용한다거나 싱글 스레드 모델을 적용하는 등 아키텍쳐를 변경하지 않고도 바꿀 수 있는 지였다. 이에 많은 팀원들이 여러 가지 방법을 제안해주셨다. 흥미로운 이야기들이 많이 오고갔는데(사실상 거의 모든 동시성 해결 기술이 언급된듯), 결과적으로 리드님께서 원하는 방향은 테이블 구조..

Java 2023.10.10

@Transactional은 만능이 아닙니다 -2 트랜잭션의 격리성과 lock

Introduction 지난 시간에는 트랜잭션의 개념과 어떨 때 트랜잭션을 사용해야 하는지에 대해서 배웠다. 그런데 1부에서 얘기했던 것과 같이, @Transactional을 제거했더니 Exception이 발생했다. 이 문제는 어떻게 해결할 수 있을까? 다시 코드를 살펴보도록 하자. Code UserController @PutMapping("/user/{Id}") public void moveDateTime(@PathVariable long userId) { userService.moveDateTime(userId); } UserService public void moveDateTime(long userId) { Timestamp targetDateTime = Timestamp.valueOf(ZonedD..

Spring Data 2022.09.25