InnoDB 버퍼 풀(Buffer Pool) : 메모리 내의 캐시 영역으로, 실제 데이터를 디스크에서 읽어오지 않고 메모리에서 바로 접근할 수 있도록 하는 공간이다.데이터 파일(Data File) : 디스크에 저장된 실제 데이터 파일이다. 모든 변경 사항은 결국 디스크에 반영되어야 한다. 1. INSERT 발생INSERT INTO User(m_id, m_name, m_area)VALUES(1, '이희망', '부산'); 데이터가 새로 삽입되면, InnoDB 버퍼 풀에 해당 데이터가 먼저 기록된다. 버퍼 풀에 저장된 데이터는 백그라운드 프로세스에 의해 나중에 데이터 파일에 기록된다. 2. UPDATE 발생UPDATE SET m_area = '서울' WHERE m_id = 1; UPDATE 작업이 발생하면서 ..
1. READ UNCOMMITTED READ UNCOMMITTED는 커밋되지 않은 데이터에 접근이 가능하다.1-1. Dirty ReadREAD UNCOMMITTED 격리 수준에서는 Dirty Read가 발생한다. Dirty Read는 커밋되지 않은 데이터를 다른 트랜잭션에서 읽음으로써 발생하는 문제이다. 이는 아직 데이터베이스에 반영되지 않은 변경 사항을 읽기 때문에, 이후에 변경 작업을 수행한 트랜잭션이 ROLLBACK 될 경우 문제가 발생한다.트랜잭션 1이 공유 데이터 MIN을 KIM으로 UPDATE 한다.아직 데이터베이스에 커밋되지 않은 상태이다.이때, 트랜잭션 2는 트랜잭션 1이 커밋하지 않은 KIM 데이터를 읽는다.만약 트랜잭션 1이 중간에 문제가 발생하여 ROLLBACK 할 경우, 데이터는 다..
1. SELECT FOR UPDATESELECT * FROM Student WHERE id = 1 FOR UPDATE;SELECT FOR UPDATE를 실행하면 조회된 레코드에 대해 LOCK이 설정되어 해당 세션이 UPDATE 쿼리를 완료하고 COMMIT 또는 ROLLBACK 할 때까지 다른 세션에서 해당 레코드를 수정할 수 없다. 2. SELECT FOR UPDATE FlOW2-1. 테스트 환경도커를 사용하여 테스트 환경을 구성한다.MysQL 이미지 설치 : docker pull mysql:latestMySQL 컨테이너 실행 : docker run --name test-mysql-container -e MYSQL_ROOT_PASSWORD=1234 -d -p 3313:3306 mysql:latest My..
1. LockSupport1-1. LockSupport란?synchronized의 경우 임계 영역에 접근하지 못하고 대기 중인 스레드는 BLOCKED 상태가 된다. BLOCKED 상태는 다른 스레드에 의해 interrupt 될 수 없기 때문에 lock을 얻지 못하면 영원히 대기 상태로 유지한다.LockSupport는 무한 대기를 해결하기 위해서 대기 중인 스레드의 상태를 BLOCKED가 아닌 WAITING 이 되게 한다. WAITING 상태는 다른 스레드가 interrupt를 통해 깨우거나, 스스로가 시간을 정하여 깨어날 수 있다.1-2. LockSupport의 대표적인 기능park() : 현재 스레드를 WAITING 상태로 바꾼다.parkNanos(nanos) : 나노초 동안 현재 스레드를 TIMED_..
1. 실행 환경Java 17Gradle 8.5SpringBoot 3.2.3 2. 기존 코드우리 프로젝트의 경우 게시물(Section)에 좋아요 기능과 관련한 API를 Redis를 사용하여 처리하고 있다. Redis에서 (key: SectionId, value:listof(userId))로 관리하고 있다.30초 간격으로 스케줄링을 통해 Redis에 좋아요 정보를 DB의 Likes 테이블로 옮긴다.// 30초마다 Redis 좋아요 기록을 DB의 Likes 테이블에 저장한다.@Scheduled(fixedDelay = 1000L * 30)@Transactionalpublic void saveLikes() { log.info("스케줄링 호츌"); // 정규식에 해당하는 모든 key를 조회한다. S..