Database
-
MVCC (Multi-Version Concurrency Control)와 언두 로그(Undo Log), 리두 로그(Redo Log)Database 2024. 8. 6. 10:53
1. MVCC (Multi-Version Concurrency Control)MVCC는 다중 버전 동시성 제어 기법으로, 데이터베이스 관리 시스템(DBMS)에서 동시성을 제어하기 위한 기술입니다. 이는 데이터베이스의 일관성과 무결성을 유지하면서 동시에 여러 트랜잭션을 지원하는 방법입니다. MVCC는 일반적으로 다음과 같은 방식으로 작동합니다.버전 관리: 각 데이터 항목은 여러 버전을 가질 수 있습니다. 새로운 트랜잭션이 데이터 항목을 변경할 때마다 새로운 버전을 생성합니다.스냅샷 읽기: 각 트랜잭션은 자신의 시작 시점의 데이터베이스 스냅샷을 사용합니다. 즉, 트랜잭션은 자신이 시작된 시점에 존재했던 데이터 버전만을 읽습니다.쓰기 시점 충돌 방지: 두 트랜잭션이 동일한 데이터 항목을 동시에 변경하려고 할 ..
-
넥스트 키 락(Next-Key Lock) in Database SystemsDatabase 2024. 8. 6. 00:26
넥스트 키 락에 대한 소개넥스트 키 락은 데이터베이스 시스템에서 트랜잭션을 처리할 때 사용되는 동시성 제어 메커니즘입니다. 이는 주로 팬텀 리드(phantom read) 현상을 방지하는 데 유용합니다. 넥스트 키 락에서는 개별 행에 락을 거는 것이 아니라, 행과 행 사이의 간격에 락을 겁니다. 이렇게 하면 데이터베이스가 읽기와 쓰기를 보다 효과적으로 관리할 수 있어, 동시성 트랜잭션 간 데이터 일관성과 고립성을 보장할 수 있습니다.넥스트 키 락의 구성 요소레코드 락(Record Locks): 실제 행에 걸리는 락.갭 락(Gap Locks): 행 사이의 간격에 걸리는 락.넥스트 키 락(Next-Key Locks): 레코드 락과 갭 락의 조합으로, 두 개의 연속된 인덱스 레코드 사이의 간격에 락을 겁니다.넥..
-
Phantom RowsDatabase 2024. 8. 6. 00:24
17.7.4 Phantom RowsPhantom 문제는 트랜잭션 내에서 동일한 쿼리가 다른 시간에 다른 행 집합을 생성할 때 발생합니다. 예를 들어, 두 번 실행된 SELECT가 처음에는 반환되지 않은 행을 두 번째 실행 시 반환하면 그 행은 "Phantom " 행입니다.child 테이블의 id 열에 인덱스가 있고, id 값이 100보다 큰 모든 행을 읽고 잠그고자 하는 경우:SELECT * FROM child WHERE id > 100 FOR UPDATE;쿼리는 id가 100보다 큰 첫 번째 레코드에서 시작하여 인덱스를 스캔합니다. 테이블에 id 값이 90과 102인 행이 있는 경우, 인덱스 레코드 범위에 설정된 잠금이 간격(이 경우 90과 102 사이의 간격)에 삽입을 잠그지 않으면, 다른 세션이 i..
-
MariaDB Lock(이론)Database 2023. 4. 1. 15:16
Database에서의 Lock 데이터베이스에서 LOCK은 트랜잭션이 데이터를 읽거나 쓰는 과정에서 다른 트랜잭션과의 충돌을 방지하는 데 사용됩니다. LOCK은 크게 SHARED LOCK과 EXCLUSIVE LOCK 두 가지 유형이 있습니다. 데이터베이스에서 LOCK은 트랜잭션 간의 충돌을 방지하고 데이터 일관성을 유지하는 데 매우 중요합니다. 따라서 적절한 LOCK 유형을 선택하여 데이터베이스에서 발생할 수 있는 충돌을 최소화하는 것이 중요합니다. SHARED LOCK 다른 트랜잭션에서 데이터를 읽을 수는 있지만, 쓰기 작업은 할 수 없도록 제한합니다. 즉, 읽기 작업에 대해서는 다른 트랜잭션과 공유할 수 있지만, 쓰기 작업에 대해서는 배타적으로 사용해야 합니다. SHARED LOCK은 동시에 여러 개의..
-
MariaDB IsolationDatabase 2023. 4. 1. 14:34
Isolation Level READ UNCOMMITTED 이 격리 레벨에서는 커밋되지 않은 데이터에 대한 읽기 작업도 허용됩니다. 따라서 다른 트랜잭션에서 변경 작업을 수행하는 동안, 해당 데이터에 대한 읽기 작업을 수행하면 변경 작업의 결과를 볼 수 있습니다. 이러한 이유로 이 격리 레벨은 데이터 일관성과 무결성이 보장되지 않으므로 사용하지 않는 것이 좋습니다. READ COMMITTED 이 격리 레벨에서는 커밋된 데이터만 읽을 수 있습니다. 따라서 다른 트랜잭션에서 변경 작업을 수행하는 동안, 해당 데이터에 대한 읽기 작업을 수행하면 변경 작업의 결과를 볼 수 없습니다. 이 격리 레벨은 데이터 일관성과 무결성을 보장하면서도, 동시성을 높일 수 있어서 가장 많이 사용되는 격리 레벨 중 하나입니다. R..
-
MariaDB Lock(실전)Database 2023. 4. 1. 12:08
여기서는 실제 테스트 한 내용을 토대로 작성하였습니다. MariaDB에서 락이 걸리는 상황에 대해서 이야기 해보겠습니다. 테스트 환경 MariaDB 버전 : 10.4.21-MariaDB-1:10.4.21+maria~focal Isolation : REPEATABLE READ 트랜잭션 갯수 : 2개 테스트에 사용되는 테이블 스키마 create table users ( id int auto_increment primary key, first_name varchar(300) not null, last_name varchar(300) not null, email varchar(300) not null, gender varchar(300) not null, ip_address varchar(300) not nul..
-
MariaDB Index 1편Database 2023. 3. 20. 09:09
목차 인덱스 통계 정보 확인 CARDINALITY MariaDB 데이터 및 인덱스 용량 확인 커버링 인덱스 인덱스 통계 정보 확인 인덱스 통계 정보를 확인하는 방법은 다음과 같습니다. user 테이블이 있다고 가정한다면, 다음과 같이 쿼리를 실행하면 됩니다. ANALYZE TABLE users; SHOW INDEX FROM users; SHOW INDEX FROM users WHERE Index_type = 'BTREE'; -- 아래와 같이 조회해도 동일. SELECT * FROM information_schema.STATISTICS; 통계 정보에서 조회되는 컬럼이 갖는 의미는 다음과 같습니다. TABLE_CATALOG: 인덱스가 속한 데이터베이스의 이름 TABLE_CATALOG 컬럼의 값이 def인 ..
-
HikariCP 설정 일부분 들여다 보기Database 2023. 2. 26. 15:41
이번 글에서는 HikariCP를 설정하면서, 각 설정이 어떤 영향을 미치는지 확인해 보도록 하겠습니다. https://github.com/brettwooldridge/HikariCP HikariCP 공식 문서에 가보면, 설정들에 대해 자세한 코멘트가 되어 있습니다. 여기서 확인해 볼 HikariCP 설정 목록 connectionTimeout validationTimeout connectionTestQuery 참고로, 아래 4개 항목은 내용 정리만 되었습니다. minimumIdle maximumPoolSize idleTimeout maxLifetime 전체 코드 우선 전체 코드를 한번 보면 좋을 것 같네요. 보시는데 무리만 없을 정도로 정리 했습니다. 그리고, 중간중간 이해되지 않는 코드가 몇 줄 있을 수..