이번에는 트랜잭션 격리 수준(Isolation Level)과 그로 인해 발생하는 부정합 문제를 직접 실습해보도록 하겠습니다. 혹시 트랜잭션 격리 수준(Isolation Level)에 대한 이해가 부족하다면 관련 포스팅을 참고해주세요. 1. 트랜잭션의 격리 수준(Transaction Isolation Level) 트랜잭션 격리 수준을 실습하기 위해서는 먼저 테이블을 만들고 데이터를 넣어두어야 한다. 아래의 쿼리를 통해 먼저 테이블을 생성해두도록 하자. 해당 테이블은 자동 증가열을 pk로 하며, name에는 넥스트 키 락을 위해 인덱스를 설정해두었다. create table member ( id bigint auto_increment primary key, name varchar(255) not null, ..
이번에는 트랜잭션 격리 수준(Isolation Level)에 대해 알아보도록 하겠습니다. 아래의 내용은 RealMySQL과 MySQL 공식 문서 등을 참고하여 작성하였으며, 모든 내용은 InnoDB를 기준으로 설명합니다. 해당 내용을 완벽하기 이해하기 위해서는 MySQL이 제공하는 스토리지 엔진 수준의 락에 대해 알고 있어야 합니다. 혹시 모르면 관련 포스팅을 참고해주세요. 1. 트랜잭션의 격리 수준(Transaction Isolation Level)트랜잭션의 격리 수준(Isolation Level)이란 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것이다. 트랜잭션의 격리 수준은 격리(고립) 수준이 높은 순서..
이번에는 스토리지 엔진 수준의 락의 종류에 대해 알아보도록 하겠습니다. 아래의 내용은 RealMySQL과 MySQL 공식 문서 등을 참고하여 작성하였으며, 모든 내용은 InnoDB를 기준으로 설명합니다. 1. 스토리지 엔진 수준의 락의 종류 MySQL에서 사용되는 락은 크게 스토리지 엔진 레벨과 MySQL 엔진 레벨로 나눌 수 있다. 스토리지 엔진 레벨의 잠금은 테이블의 데이터를 다루기 위한 락이며, MySQL 엔진 레벨의 잠금은 테이블이나 데이터베이스 등과 같은 부분을 위한 락에 해당한다. 그리고 이번에 살펴볼 잠금은 스토리지 엔진 레벨의 잠금이다. 레코드 락(Record Lock) 갭 락(Gap Lock) 넥스트 키 락(Next Key Lock) 자동 증가 락(Auto Increment Lock) [..
이번 포스팅은 문제가 발생하였을 때, 어떻게 장애를 인지하고, 원인을 찾고, 조치 및 대응을 하였는지에 대한 흐름을 기록하기 위해 작성하게 되었습니다. 에러 자체는 대응하기 어려웠던 문제는 아니지만, 문제 상황에서 어떻게 대처하는지 궁금하신 분들께 도움이 되었으면 좋겠습니다. 1. The last packet successfully received from the server was 12,345,678 milliseconds ago 에러 대응하기 [ 문제 상황 인지하기 ] 현재 사내에서는 APM 도구인 핀포인트와 로그 수집 도구인 넬로 등을 활용하여 문제 상황을 인지하고 파악하고 있다. 에러 알람이 와서 확인해보니, 다음과 같은 에러가 발생하고 있었다. org.springframework.dao.Reco..
이번에는 데이터베이스가 트랜잭션을 지원하는 방법과 동작 과정에 대해 살펴보도록 하겠습니다. 아래의 내용은 RealMySQL과 MySQL 공식 문서 등을 참고하여 작성한 내용입니다. 1. MVCC(다중 버전 동시성 제어)와 언두 로그(Undo Log), 리두 로그(Redo Log) [ MVCC(다중 버전 동시성 제어)란? ] 데이터베이스를 사용하는 가장 큰 이유 중 하나는 바로 트랜잭션 때문이다. 하지만 모든 DBMS가 트랜잭션 기능을 제공하지는 않는데, 대표적으로 MySQL의 스토리지 엔진 중 하나인 MyISAM이 그렇다. 대신 MySQL의 InnoDB는 레코드 단위까지 트랜잭션을 지원해준다. 레코드 수준의 트랜잭션을 지원하기 위해서 InnoDB는 MVCC를 사용한다. MVCC(Multi-Version ..