분류 전체보기 (225) 썸네일형 리스트형 예약 동시성 제어 과정 0. 개요이 글은 프로젝트에서 진행했던 예약 동시성 제어 과정에 대한 글이다. 문제 상황은 다음과 같다. 한 트레이너는 특정 시간에 하나의 예약만 받을 수 있다. 그러나 여러 회원이 동시에 요청을 보낼 때 2개 이상의 예약이 완료되는 문제가 발생했다. 즉, 동시성 제어가 필요한 상황이다. 예약 로직은 다음과 같다.트레이너 이메일과 예약 시간을 기준으로 예약 내역을 조회한다. (SELECT)조회된 예약이 없으면 새로운 예약을 생성하여 저장한다. (INSERT)동시성 문제 해결 과정은 다음과 같다.1. 자바의 synchronized 키워드예약 로직 메서드에 synchronized 키워드를 붙이는 방법이다.@Service@Transactional@RequiredArgsConstructorpublic class.. Backlog Queue와 Accept Queue Backlog Queue와 Accept QueueTCP 연결은 3-way handshake 과정을 통해 이뤄진다. 이 과정에서 서버 측 커널은 다음 두 가지 큐를 유지한다.Backlog Queue(SYN Queue): 클라이언트 측이 보낸 SYN 요청에 대해 half-open 요청을 해당 큐에 저장한다.Accept Queue: 3-way handshake가 완료되어 클라이언트로부터 ACK 패킷을 수신하면, 완전히 연결된 요청을 해당 큐에 저장한다.3-way handshake 과정을 통해 두 큐의 쓰임을 살펴보자.클라이언트 측은 연결을 시작하기 위해 서버 측에 SYN을 보낸다. 클라이언트 측은 SYN_SENT 상태가 된다.서버 측이 클라이언트 측으로부터 SYN을 수신하면, 서버 측은 SYN_RECV 상태가.. MySQL의 갭 락과 넥스트 키 락에 대해 프로젝트에서 MySQL을 사용하며 락과 트랜잭션 격리 수준에 대한 문제를 여러 번 마주했었다. 이번 기회에 좀 더 제대로 알고자 글을 쓴다. InnoDB 스토리지 엔진 잠금InnoDB 스토리지 엔진은 MySQL에서 제공하는 잠금과는 별개로 스토리지 엔진 내부에서 레코드 기반의 잠금 방식을 제공한다. 따라서 MyISAM보다 훨씬 뛰어난 동시성 처리를 제공할 수 있다. 또한 레코드 락뿐 아니라 레코드와 레코드 사이의 간격을 잠그는 갭 락이라는 것도 제공한다. InnoDB 스토리지 엔진은 인덱스 레코드에 락을 건다InnoDB 스토리지 엔진은 레코드를 잠글 때, 레코드 자체가 아니라 인덱스의 레코드를 잠근다. 인덱스가 하나도 없는 테이블이더라도 내부적으로 자동 생성된 클러스터 인덱스를 이용해 잠금을 설정한다... 톰캣이 요청에 스레드를 할당하는 방법 1. 스레드 풀톰캣은 멀티 스레딩을 지원한다. 즉, 동시에 여러 HTTP 요청들을 처리해준다. 그리고 이때 스레드 풀을 사용해서 스레드를 효율적으로 관리한다. 따라서 스레드 풀에 대해 먼저 알아보자. 자바는 One-to-One Threading Model로 스레드를 생성한다. 즉, 자바에서 유저 스레드를 생성하면 해당 스레드는 운영체제 스레드와 1:1로 매핑된다. 따라서 자바에서 스레드를 생성할 때마다 OS 작업이 수행되기 때문에 스레드 생성 비용이 많이 든다. 그리고 스레드가 무한정으로 생성되면 그만큼 메모리를 차지하게 되고 컨텍스트 스위칭이 빈번히 발생한다. 따라서 스레드 풀이란 개념이 등장한다. 스레드 풀은 일정량의 스레드를 미리 만들어 두고 필요한 시점에 꺼내 사용하는 방식이다.자바의 스레드 풀자.. 서비스 계층에 @Transactional 어노테이션을 붙이는 것에 대한 고찰 @Transactional 어노테이션스프링은 AOP를 통해 트랜잭션 시작과 종료를 간편하게 할 수 있도록 지원한다. 덕분에 @Transactional 어노테이션을 통해 비즈니스 로직에 트랜잭션 관련 로직이 섞이지 않을 수 있다. 트랜잭션 처리 로직은 프록시 객체가 가져가고, 서비스 계층에는 순수한 비즈니스 로직만 남길 수 있게 해준다. @Transactional을 적용했을 때 동작 과정은 다음과 같다.트랜잭션을 시작하기 위해서는 먼저 커넥션이 필요하다.커넥션을 획득했으면, 해당 커넥션을 통해 auto commit 속성을 false로 설정한다. 즉, 트랜잭션이 시작되었고, 이후 진행되는 로직들은 DB에 바로 반영되지 않고 커밋 시점에 반영된다.이후 서비스 계층 내에서 DB에 접근하는 메서드가 실행되면 해당.. 프로세스 동기화, 데드락(교착 상태) 공유 자원, 임계 영역(Critical Section), 경쟁 상태(Race Condition)공유 자원: 여러 스레드가 동시에 접근할 수 있는 자원을 공유 자원이라고 한다.임계 영역: 공유 자원 중 여러 스레드가 동시에 접근했을 때 문제가 생길 수 있는 부분을 임계 영역이라고 한다.경쟁 상태: 둘 이상의 스레드가 공유 자원에 동시 접근했을 때 실행 순서에 따라 결과 값이 달라지는 상황을 의미한다.따라서 경쟁 상태를 방지하고 데이터 일관성을 보장하기 위해 임계 영역에 하나의 스레드만 접근할 수 있도록 제어해야 한다.* Race Condition은 CPU 코어가 1개일 때도 발생할까?결론은 Race Condition은 CPU 코어가 1개일 때도 발생한다. CPU 코어가 1개인 경우에는 동시에 하나의 프로세.. 스레드 로컬(ThreadLocal) ThreadLocalThreadLocal은 클래스로, 이 스레드 로컬을 통해 각 스레드 별로 필요한 정보를 저장할 수 있다. 각 스레드는 자신만의 스레드 로컬을 가질 수 있으며, 다른 스레드의 스레드 로컬에는 접근할 수 없다. 각 스레드 별로 별도의 스레드 로컬을 갖기 때문에 멀티스레드 환경에서 공유 자원에 대한 동기화 문제를 피하고, 각 스레드가 자신의 상태를 안전하게 유지할 수 있다.ThreadLocalMapThreadLocalMap은 ThreadLocal의 정적 내부 클래스이다. 모두 private으로 구성되어 있어서 외부에서 접근 가능한 메서드가 없다. Thread 클래스는 ThreadLocalMap을 멤버로 갖는다. 즉, 각 스레드마다 ThreadLocalMap을 갖는다.public class.. [백준] 10713. 기차 여행 https://www.acmicpc.net/problem/10713 가격 비교 (min(a * k, c + b * k)) 각 철도를 이용하는 총 횟수를 알아내고, 그에 따라 해당 철도를 이용할 때 티켓을 구매하는 방법과 IC 카드를 구매하는 방법 중 가격이 더 작은 방법을 이용하면 된다.철도 이용 횟수 구하기 (누적합)각 철도를 이용하는 횟수를 구해야 하는데, 만약 도시 1번에서 3번으로 이동할 경우, 1번 철도와 2번 철도를 이용한다. 그런데 이런 식으로 카운트하면, 이동 횟수가 m번이고 매 이동마다 가장 먼 도시로 이동한다고 가정했을 때 O(m * n)의 시간 복잡도가 소요되어 시간초과가 날 수 있다.따라서 누적합을 이용해야 한다. 누적합 활용 방식은 다음과 같다.도시 1번에서 5번으로 이동한다고 .. 이전 1 2 3 4 5 6 7 ··· 29 다음