# MVCC

16개의 포스트
post-thumbnail

[Real MySQL 4장] 아키텍처

MySQL 아키텍처 image 프로그래밍 API를 통해 MySQL에 요청을 보낸다. MySQL은 요청 받은 쿼리를 분석해서 최적의 실행계획을 수립 및 스토리지 엔진에게 명령한다. 받은 명령대로 스토리지 엔진이 디스크에 접근하여 데이터를 입출력한다. 쿼리 실행 구조 image 쿼리 파서 요청으로 들어온 쿼리를 MySQL이 인식할 수 있는 최소 단위인 토큰으로 분리해 트리 형태의 구조로 만드는 역할을 한다. 쿼리 문장의 기본 문법 오류는 여기서 발견된다. 전처리기

2023년 9월 8일
·
0개의 댓글
·
post-thumbnail

데이터베이스 CS 정리

SQL이란? SQL은 선언적인 언어로, 관계형 데이터베이스에 정보를 저장하고 처리하기 위한 프로그래밍 언어입니다. SQL을 통해 데이터베이스의 구조 지정, 데이터 삽입/수정/조회/삭제, 성능 향상과 최적화를 진행할 수 있습니다. SQL이 선언적 언어인 이유는 무엇을 할지에 대해서만 정의해주고, 구체적인 동작 과정은 데이터베이스의 옵티마이저에 일임하여 최적화된 방법으로 처리하도록 하기 때문입니다. 파일시스템에 비해 데이터베이스가 가지는 장점은? 데이터베이스는 여러 사용자와 응용 프로그램이 동시에 접근할 수 있고, 통합하여 관리하기 때문에 데이터의 중복을 최소화하는 동시에 데이터의 일관성을 유지할 수 있습니다. 또한 허가된 사용자들만 데이터베이스에 접근할 수 있도록 설정함으로써 데이터의 보안성도 파일시스템에 비해 높습니다. 접근 방법이 응용프로그램에 상세하게 표현되어 있는 파일 시스템과 달리 데이터데이스는 비교적 독립적으로 존재하여, 프로그램을 수정하지 않더라도 데이터의

2023년 9월 3일
·
0개의 댓글
·
post-thumbnail

Serializable 격리 수준: MySQL과 PostgreSQL의 차이점

들어가며 이전 글에서 이어집니다. 이번 글에서는 MySQL에서 어떻게 lost update를 해결할 수 있는 지 살펴보겠습니다. MySQL에서 lost update 문제 해결 MySQL에서 Lost Update 문제를 해결하기 위해서는 Repeatable Read isolation level만으로는 해결하기 어려울 수 있습니다. 이런 경우 Locking Read를 사용하여 문제를 해결해야 합니다. Locking Read는 DBMS가 자동으로 처리해주는 것이 아니기 때문에 개발자가

2023년 8월 31일
·
0개의 댓글
·
post-thumbnail

[DB] MVCC(다중 버전 동시성 제어)란?

들어가며 해당 강의를 보고 공부한 내용을 정리하였습니다. 이전 글에서는 Lock과 함께 2PL protocol을 살펴보았습니다. 해당 개념을 살펴보면서 데이터 전체 처리량에 대한 문제가 발생하였고 이를 해결하기 위해 MVCC를 사용하였다고 정리하였습니다. 이번 글에서는 MVCC에 대해 자세히 살펴보겠습니다. MVCC 등장배경

2023년 8월 30일
·
0개의 댓글
·

[Database] MVCC와 InnoDB기반의 MySQL

저번 글([JPA] @Transactional과 synchronized를 동시에 사용할 때의 DB 동기화 이슈)에 이어 이번엔 왜 멀티 쓰레드 환경에서 하나의 트랜잭션에서 하나의 row 데이터에 접근하여 데이터를 변경하는 쿼리를 날리고(flush), 다른 트랜잭션에서 같은 데이터 row에 접근했을 때 변경되지 않은 데이터 값을 가져오는지 알아보기 위해 MVCC에 대해 알아보고 MySQL이 어떻게 동시성 제어를 하는지 보도록 한다. MVCC? Multi Version Control Concurrency의 약자로 다중 버전 동시성 제어라고 한다. Locking의 성능 문제 때문에 탄생하게 되었다. Lock을 사용하지 않고 일관된 읽기를 제공하는 것이 주 목적이다. 사용자는 MVCC에서 데이터

2023년 8월 4일
·
0개의 댓글
·
post-thumbnail

[Real MySQL] 04. MVCC - 레코드 레벨 트랜잭션

이 포스팅은 Real MySQL의 04장을 읽고 개인적으로 학습하고 이해한 내용입니다. 틀린 부분이 있다면 언제든 지적 부탁드립니다. 테이블에 특정 레코드를 수정하고 아직 COMMIT되지 않은 상태에서 다른 세션이 해당 레코드를 읽었을 때는 어떤 데이터를 어떻게 읽게되는걸까? 라는 생각을 했었는데요. MYSQL에서 지원하는 MVCC를 통해 살펴보도록 하겠습니다. MVCC란? MVCC는 Multi Version Concurrency Control의 약자로, 레코드에 대해 여러 버전이 동시에 관리되어 레코드 레벨 트랜잭션에서 일관된 읽기를 제공하는 기능입니다. 쉽게 말해 특정 레코드에 걸린 잠금을 기다리지않고 읽기 작업을 할 수 있다는 의미인데요. 이는 MySQL InnoDB 메모리 중 로그 버퍼에 존재하는 언두 로그로 가능한 부분입니다. 언두 로그는 변경되기전 데이터를 저장하는 임시 공간이며, 트랜잭션에서 rollback시 이전 데이터를 참고하는 곳이기도 합니다. 예

2023년 5월 24일
·
0개의 댓글
·
post-thumbnail

MYSQL 락과 트랜잭션

사보정 프로젝트를 마무리하고 나서 다른 프로젝트에 투입되면서 프로젝트에서 사용하여 저번에 못다한 MYSQL에서 사용하는 LOCK에 대해서 알아보고 왜 MYSQL에서 Repeactable read 격리수준에서 Phantom Read 문제가 발생하지 않는 이유에 대해서도 알아보자. lock 기존에 Oracle에서 발생할 수 있는 lock에 대해서 배웠으나 MySQL에서는 다르게 작용하는 부분이 있어서 작성하게 되었다. MySQL에서 사용되는 락(LocK)은 크게 MySQL 엔진 레벨의 락과 스토리지 엔진 레벨의 락으로 나눠볼 수 있다. mysql 엔진 레벨 락 글로벌 락 모든 테이블에 잠금을 거는 락이며 "FLUSH TABLES WITH READ LOCK" 명령으로 락을 걸 수 있다. > 내용만 바라보면 원자성 제공을 위하다기 보다는 일시적으로 mysql 잠그려는 느낌이 강하다. 뒤에 binlog와 복제에 대해서 자세히 다룰 예정이지만

2023년 5월 13일
·
0개의 댓글
·

[Database] Postgres의 MVCC

TL;DR RDBMS는 동시성제어의 방식으로 MVCC를 사용하고 있다. MVCC ( Multi-Version Concurrency Control )란 데이터 일관성을 확보하기 위해서 데이터에 대한 버전관리를 통해서 이를 해결한 방식이다. 그 말인즉 데이터를 쿼리하기 위해 Transaction을 만들었다면 해당 Transaction은 데이터의 스냅샷 ( Snapshot ) 을 보고 있는 것이다. 이러한 방식을 통해서 Reading 하는 작업에 대해서 Locking을 걸지 않고 진행을 할 수 있기 때문에 높은 성능을 얻을 수 있게 된다. MVCC를 구현하는 방법 RDBMS 마다 MVCC를 구현한 방식이 다르다. 개념 자체는 동일하지만 버전관리를 어떻게 하느냐에 따라서 차이가 생긴다. 가장 많이 사용되고 있는 RDBMS인 MySQL(InnoDB), Postgres의 구현 방법을 알아볼 예정이다. 이번 포스팅에서는 Postgres의 방식을 먼저 살펴보자. Postgre

2023년 5월 6일
·
0개의 댓글
·
post-thumbnail

Vacuum processing in PostgreSQL

Goals PostgreSQL 의 특징인 Vacuum 의 필요성에 대해 이해한다. Vacuum 의 내부 동작에 대해 이해한다. PostgreSQL 에는 Vacuum 이라는 개념이 존재한다. 이는 Garbage Collector 와 유사한 역할을 수행하는 동작으로, 사용하지 않는 데이터를 제거하여 메모리 공간을 확보하는 작업이다. 이러한 작업이 필요한 이유는 PostgreSQL 의 MVCC 내부 구현이 다른 RDBMS 와 차이가 있어, 이로 인한 문제를 해결하기 위함이다. ✅ PostgreSQL MVCC 먼저, PostgreSQL 의 MVCC 내부 동작을 살펴보자. MVCC 란 이전에 정리한 글에서도 살펴봤듯이, DBMS 에서 발생하는 이상현상을 효과적으로 억제하고, 특정 데이터에 대한 Read, Write 연산의 충돌 혹은 Locking 을 방지하여 높은 동시 처리량을 제공하기 위해 RDBMS 에서 제공하는 기능이다. MVCC

2023년 2월 23일
·
0개의 댓글
·
post-thumbnail

Isolation Level, Lock and MVCC in RDBMS

💡 Isolation Level 다수 사용자 환경에서 여러 Transaction 이 동시에 실행될 때 발생할 수 있는 다양한 이상현상들을 제어하는 수준으로, Transaction 의 ACID 원칙 중 Isolation 을 지원하기 위해 제공된다. Isolation Level 이 높다 높은 Serializability 높은 안정성 동시 처리 가능한 트랜잭션 수 감소 Isolation Level 이 낮다 낮은 Serializability 낮은 안정성 동시 처리 가능한 트랜잭션 수 증가 다시 말해, Isolation Level 에서 데이터의 정합성과 성능은 trade-off 관계에 있으며, 개발자는 애플리케이션 혹은 개발하고자 하는 기능의 특성을 고려하여 적절한 Isolation Level 을 선택할 수 있어야 한다. Read Uncommitted **Commit 되

2023년 2월 14일
·
0개의 댓글
·
post-thumbnail

[PostgreSQL] PostgreSQL 그리고 Vacuum

MySQL을 주로 사용해왔던 사람이라면, 혹은 DB에 대해서 깊지 않게 생각한 사람이라면 PostgreSQL과 MySQL이 이름만 다르지 크게 다르지 않을거라고 생각할 수 있다. 과거의 나도 그러했는데 막상 사용하다보니 각각의 특징과 매력이 있다는 것을 알게 되었다. 그중에 두 DB의 차이의 핵심이라고 생각되는 Vacuum이라는 개념을 알아보려고 한다. Vacuum에 대해 알기 전에 PostgreSQL이 어떻게 이루어져있는지 알아보자. Tuple MySQL에서 사용하는 row와 같은 역할을 하는 친구라고 생각하면 편한데 PostgreSQL은 데이터가 Tuple로 저장된다. Tuple은 Live Tuple, Dead Tuple 총 2종류의 Tuple이 존재한다. 간단하게 번역해보면 살아있는 튜플, 죽은 튜플로 번역 그대로의 역할을 한다. Live Tuple은 테이블 조회 시 보이는 데이터이고, Dead Tuple은 일련의 과정으로 인해 **물리

2023년 2월 7일
·
0개의 댓글
·
post-thumbnail

MySQL InnoDB Cluster의 동시성 제어(group_replication_consistency)

InnoDB Cluster는 5가지의 동시성 제어 모드를 제공하며groupreplicationconsistency 파라미터 설정으로 변경할 수 있다. 1. Eventual 데이터는 최종적으로 일관성이 유지되나, 각 노드 간의 읽기 트랜잭션 결과가 일치하지 않는 순간이 발생할 수 있다. Eventual 모드에서 트랜잭션 처리 과정은 아래와 같다. Primary Node에서 Write transaction 요청 수신 Consensus (합의) 수행 다른 노드들로 트랜잭션 데이터를 전파 과반수 노드로부터 ACK 수신시 Majority 획득 인증 자기 DB의 선행 트랜잭션을 검사해서 충돌 여부를 검사 충돌 발생시 트랜잭션 롤백 RW트랜잭션을 수신했던 노드는 binary log에 로그 선행 기입 RW트랜잭션을 전파받은 노드는 relay log에 로그선행 기입 후, applier thread에서 릴레이 로그에 기록된 트랜잭션을 실행하

2022년 10월 28일
·
0개의 댓글
·

오라클 MVCC 패턴

MVCC란? 데이터를 변경할 때마다 그 변경사항을 undo 영역에 저장하며, 이후 데이터를 읽다가 쿼리 시작 시점 이후에 변경된 값 발견 시 undo 영역에 저장하였던 정보를 이용하여 쿼리 시작 시점의 일관성 있는 버전(CR Copy)를 생성하고 읽는다. MVCC는 문장수준과 트랜잭션 수준의 읽기 일관성이 존재한다. 문장수준 읽기 일관성 문장수준 읽기 일관성은, 다른 트랜잭션에 의해 데이터의 추가, 변경, 삭제가 발생하더라도 단일 SQL문 내에서 일관성 있게 값을 읽는 것을 이야기함. 일관성의 기준은 쿼리를 시작하였을 때 값을 이야기함. 트랜잭션 수준 읽기 일관성 트랜잭션 수준 읽기 일관성은, 다른 트랜잭션에 의해 데이터의 추가, 변경, 삭제가 발생하더라도 트랜잭션 내에서 일관성 있게 값을 읽는 것이다. Read Committed에서 완벽한 문장수준의 읽기 일관성을 보장하는 MVCC 매커니즘도 트랜잭션 수준의

2022년 10월 20일
·
0개의 댓글
·

MVCC 란?

MVCC 란? Multi Version Concurrency Content의 약자로, 여기서 Multi Version은 하나의 레코드에 여러 버전이 관리된다는 의미이다. 데이터베이스 관리 시스템이 일반적으로 사용하는 동시성 제어 방식으로 데이터베이스로의 동시 접근(잠금을 사용하지 않는 일관된 읽기)을 제공한다. MVCC를 사용하면 Locking 메커니즘이 불필요함에도 불구하고 오라클 등 일부 MVCC 데이터베이스에서는 Lock을 사용한다. MVCC 의 탄생 배경 기존 Locking 메커니즘의 문제점 읽기 작업과 쓰기 작업이 서로 방해를 일으키기 때문에 동시성 문제가 발생한다. 데이터 일관성에 문제가 생기는 경우도 있어서 Lock을 더 오래 유지하거나 테이블 레벨의 Lock을 사용해야 하고, 동시성 저하가 발생한다. 이러한 문제점들을 해결하기 위해 MVCC라는(Multi-Version Concurrency Control, 다중 버전 동시성 제어)

2022년 4월 1일
·
0개의 댓글
·
post-thumbnail

Postgres Vaccum

어쩌다 발견했어요? 급하게 작성한 코드를 재작성하면서, 이전 로그 발견. 약 100건이 넘는 Insert / Update 가 10분마다 동시에 발생함. 이때, RDS 성능향상 도우미에는 항상 autovacuum 이라는 Query 가 자동으로 실행되었음. 이게 뭘까 싶어서 확인해봤던 내용. (요즘 파일처리 듣고있는데, 지금 구현하는거랑 비슷해서 재미있네요, 이번 과제는 조지긴 했지만..) Vacuum Postgres 에만 있는 내용이고, SQLite 에도 비슷한 개념이 있다. Vacuum 이 실행되기 위한 조건이 네가지가 있는데 그 중 2가지 정도만 소개해볼 예정. 공간 재사용 Vacuum MVCC (다중 버전 동시성 제어) 구현에 따른 튜플

2021년 11월 28일
·
0개의 댓글
·

동시성 제어

동시성 제어(Concurrency Control)란 동시에 작동하는 다중 트랜잭션의 상호 간섭 작용에서 데이터베이스를 보호할 수 있어야 함을 의미한다. 동시성을 높이려고 Lock의 사용을 최소화하면 일관성을 유지하기 어렵고, 일관성을 높이려고 Lock을 적극적으로 사용하면 동시성이 저하된다. -> 동시성 제어의 목표는, 동시에 실행되는 트랜잭션 수를 최대화하면서도 입력, 수정, 삭제, 검색 시 데이터 무결성이 유지되도록 하는 데에 있다. 동시성 제어 기법 비관적 동시성 제어 사용자들이 같은 데이터를 동시에 수정할 것이라고 가정한다. 따라서 한 사용자가 데이터를 읽는 시점에 Lock을 걸고 조회 또는 갱신 처리가 완료될 때까지 이를 유지한다. for update nowait : Lock

2021년 3월 21일
·
0개의 댓글
·