본문 바로가기

MYSQL2

Spring Batch 페이징 쿼리 성능 개선하기 진행한 프로젝트에서는 인증 메일 전송을 Spring Batch를 활용해서 구현했습니다. Spring Batch에서는 2개의 Reader를 제공하는데, Cursor와 Paging입니다. Cursor는 데이터베이스와 커넥션을 맺은 후 Cursor를 옮겨가며 데이터를 조회합니다. 반면에 Paging은 페이지 단위로 데이터를 한 번에 조회해오는 방식입니다. limit과 offset을 pageSize에 맞게 자동으로 생성해서 전달해 줍니다. 사용자가 갑자기 몰릴 경우에 Cursor 방식보다 Paging 방식이 더 효율적인 구현이라 판단하고 Paging 방식을 선택하였습니다. Paging방식으로 ItemReader 인터페이스를 구현한 다양한 구현체들이 있는데, 현 프로젝트에서 사용하는 것은 Mybatis이기 때문에.. 2023. 1. 4.
MySQL Repeatable Read는 어떻게 Phantom을 막을까? (Next-Key lock) MySQL은 Repeatable Read(RR)를 지원한다. 구글링을 하거나 MySQL 메뉴얼을 참고하면 RR은 SQL-92에 명시된 이상현상을 방지하는 단계라고 적혀있다. 하지만 RR은 Phantom Read를 방지할 수 없는데, MySQL에서는 가능하다고 나와있다. 왜 이것이 가능할까? 내부적으로 어떻게 동작하고 있을까? 1. Lock과 MVCC 들어가기 전에 MySQL InnoDB가 어떻게 구현되었는 지 확인할 필요가 있다. InnoDB는 MVCC(Snapshot Isolation)을 구현한 스토리지 엔진이다. MVCC는 트랜잭션마다 테이블의 여러 버전(보통 트랜잭션 시작 시간을 기준)을 만들고 트랜잭션 작업을 진행할 때 해당 버전을 참조하는 방법을 뜻한다. 이 방법은 Lock을 걸지 않고 트랜잭션.. 2022. 8. 14.