Database(9)
-
낙관적 락과 REPEATABLE READ
고민JPA의 낙관적 락(Optimistic Lock)은 트랜잭션 커밋 시점에 데이터베이스의 version 값을 확인하여, 최초 조회 시점의 version 값과 다를 경우 롤백하는 방식으로 동작한다. 이때 다음과 같은 의문점이 들었다.commit 시점에 version 을 확인하여 최초 조회 시점과 달라진 경우 예외를 발생시키도록 동작한다면, version 을 확인하기 위해서는 기존 트랜잭션이 아닌 새로운 트랜잭션을 만든 후, 새롭게 만들어진 트랜잭션을 통해 version 값을 확인해오는 식으로 동작하는건가?이와 같이 생각한 이유는 다음과 같다.MYSQL 의 기본 isolation level 은 REPEATABLE READ 로써, 이는 한 트랜잭션에서 동일한 값을 여러번 읽었을 때, 그 결과가 동일함을 보장..
2025.02.24 -
InnoDB 알아보기 (On-Disk Structures - DoubleWriteBuffer)
Doublewrite Buffer MySQL이 비정상적으로 종료되었을 때, 버퍼 풀에서 플러시되었으나 데이터 파일에 일부만 기록된 데이터들이 생길 수 있다. (이들을 Partial-page 혹은 Ton-page 라고 한다.) InnoDB는 이러한 오작동으로 인한 데이터 손실을 방지하기 위해, 버퍼 풀의 더티 페이지를 데이터 파일에 쓰기 전에 한곳에 모아서 저장한 후(백업용도), 버퍼 풀의 더티 페이지를 데이터 파일로 쓰기 시작한다. 이때 데이터 파일에 쓰기 전 모아서 저장되는 영역을 Doublewrite Buffer라 한다. 즉 Doublewrite Buffer는 버퍼 풀에서 플러시된 데이터 페이지를 실제 데이터 파일에 쓰기 전에 저장하는 영역이다. ✔️ 작동 방식 위는 버퍼 풀에 존재하는 더티 페이지(..
2024.02.03 -
InnoDB 알아보기 (On-Disk Structures - Tablespace)
Tablespace InnoDB에는 다음과 같이 5가지 종류의 Tablesplace가 존재한다. System Tablespace File-Per-Table Tablespace General Tablespace Undo Tablespace Temporary Tablespace ✔️ Pages, Extents, Segments, 그리고 Tablespaces 테이블스페이스는 데이터를 저장하는 데 사용되는 가장 큰 논리적 단위이며, Tablespace -> Segment -> Extent -> Page -> Row 의 형태로 구성된다. page들은 extents로 그룹화되며, extents의 크기는 page의 크기에 따라 결정된다. page size가 4KB, 8KB, 16KB인 경우: 1MB (4KB 페이지 ..
2024.02.02 -
InnoDB 알아보기 (In-Memory Structures - Log Buffer)
Log Buffer 로그 버퍼는 리두 로그를 버퍼링하기 위한 메모리 영역이다. (리두 로그에 대한 자세한 내용은 다음 글에서 알아보자) 데이터의 변경이 발생하는 경우, 해당 변경에 대한 리두 로그를 기록해야 한다. 리두 로그는 디스크에 존재하므로 리두 로그의 기록은 디스크 접근을 발생시키고, 이러한 작업이 많아질수록 성능은 저하된다. 따라서 리두 로그를 매번 디스크에 기록하지 않고, 특정 영역에 저장하여 일정 주기로 디스크에 기록하도록 하여 성능을 향상시키는데, 이때 사용되는 영역이 로그 버퍼이다. 로그 버퍼의 내용을 디스크에 기록하는 주기는 innodb_flush_log_at_trx_commit을 통해 조절할 수 있다. 설정 가능한 옵션은 다음과 같다. 0: 1초에 한 번씩 리두 로그가 로그 버퍼에 쓰..
2024.01.31 -
InnoDB 알아보기 (In-Memory Structures - Adaptive Hash Index)
Adaptive Hash Index 일반적으로 인덱스(Index)라고 하면 사용자가 테이블에 생성한 인덱스(일반적으로 B-Tree 기반)를 의미한다. InnoDB는 사용자가 생성하는 인덱스 외에 자주 요청되는 데이터에 대해 자동으로 인덱스를 생성하는데, 이를 어댑티브 해시 인덱스라고 한다. 어댑티브 해시 인덱스는 innodb_adaptive_hash_index 를 통해 활성화할 수 있다. ✔️ 등장 이유 B-Tree 인덱스에서 특정 값을 찾기 위해서는 루트 노드부터 시작하여 브랜치 노드를 거쳐 리프 노드로 도달해야 한다. 인덱스를 사용하지 않고 데이터를 찾는 것에 비해서는 빠르지만, 노드를 탐색하는 과정이 필요하므로 해시 기반 인덱스보다는 느리게 동작한다. 어댑티브 해시 인덱스는 B-Tree 인덱스의 ..
2024.01.31 -
InnoDB 알아보기 (In-Memory Structures - Change Buffer)
Change Buffer 체인지 버퍼는 버퍼 풀에 존재하지 않는 세컨더리 인덱스에 대한 변경을 캐시하기 위한 메모리 영역이다. INSERT, UPDATE, DELETE 로 데이터가 변경되면, 디스크에 있는 데이터 파일을 변경하는 작업과 해당 테이블의 인덱스를 업데이트하는 작업이 필요하다. 인덱스는 디스크에 존재하므로 인덱스의 업데이트는 디스크 접근을 발생시키고, 이러한 작업이 많아질수록 성능은 저하된다. InnoDB는 변경해야 할 인덱스 페이지가 버퍼 풀에 올라와있으면 곧바로 업데이트를 수행하지만, 디스크에서 읽어와야 하는 경우에는 데이터를 바로 변경하지 않는다. 데이터의 변경은 임시 공간에 저장하고 사용자에게는 곧바로 반환하여 성능을 향상시키는데, 이때 사용되는 임시 공간이 체인지 버퍼이다. 체인지 버..
2024.01.29