반응형

전체 글 198

[데이터베이스 응용] 스토어드 프로시저(Stored Procedure)

데이터베이스를 다루다 보면, 자주 반복되는 SQL 작업을 매번 새로 작성하는 것이 번거롭게 느껴진다. 이때 활용할 수 있는 것이 바로 스토어드 프로시저(Stored Procedure)다. 이번 포스팅에서는 스토어드 프로시저의 개념과 기본 형식부터 변수 사용, 조건문, 반복문, 오류 처리까지 한 번에 정리한다.1. 스토어드 프로그램이란?스토어드 프로그램(Stored Program)은 MySQL 안에서 프로그래밍 언어와 같은 기능을 제공하는 객체들의 총칭이다. 스토어드 프로시저, 스토어드 함수, 트리거, 커서 등으로 구성된다.자주 사용되는 쿼리를 하나로 묶어서 이름을 지정한 뒤, 그 이름을 호출하는 것만으로 실행할 수 있다. 데이터베이스 내부에서 반복적으로 사용되는 기능을 효율적으로 관리하고 성능을 개선하는..

[데이터베이스 응용] RDBMS와 Redis

이번 포스팅에서는 RDB(Relational Database, 관계형 데이터베이스)가 가진 구조적 한계를 살펴보고, 그 대안으로 등장한 NoSQL과 Redis의 개념 및 캐시 전략까지 정리한다.1. RDB의 구조적 한계RDB는 데이터를 테이블 형태로 저장하고 외래키를 통해 테이블 간 관계를 맺는 방식이다. 데이터 정합성과 일관성 측면에서 강력하지만, 몇 가지 구조적인 한계가 있다.복잡한 스키마 설계RDB는 사전에 컬럼과 테이블 관계 등 정확한 스키마 설계가 필요하다. 한번 설계된 스키마를 변경하는 것은 어렵고 유연성이 떨어진다. 서비스가 성장하면서 데이터 구조가 바뀌어야 할 때마다 스키마 변경 작업이 큰 부담이 된다.정규화와 JoinRDB는 중복을 제거하기 위해 정규화를 수행한다. 그 결과 데이터가 여러..

[데이터베이스 응용] 동시성 제어(MVCC, Locking Read)

이번 포스팅에서는 MVCC의 장단점을 살펴보고, PostgreSQL과 MySQL에서 동시성 이상 현상이 실제로 어떻게 발생하고 해결되는지 구체적인 예시를 통해 정리한다.1. MVCC의 장점과 단점MVCC는 데이터를 여러 버전으로 관리하여 읽기 작업에 lock을 사용하지 않는 방식이다. 주요 장점과 단점은 다음과 같다.장점비잠금 접근 : 읽기 작업은 lock을 사용하지 않아 성능이 향상된다.일관된 읽기 : 트랜잭션이 시작될 때의 데이터를 유지해서 읽으므로, 다른 트랜잭션의 변경에 영향을 받지 않는다.고동시성 처리 : 다수의 트랜잭션이 충돌 없이 병행 처리 가능하다.롤백 가능 : Undo 로그 기반으로 복구가 용이하다.단점불필요한 데이터 증가 : 사용되지 않는 과거 버전이 쌓여 정리 작업(Garbage Co..

[데이터베이스 응용] 2PL

지난 포스팅에서는 Lock의 기본 개념과 종류, 그리고 lock을 사용해도 Nonserializable이 될 수 있다는 문제를 살펴봤다. 이번 포스팅에서는 이를 해결하는 2PL 프로토콜과 그 변형들, 그리고 MVCC까지 이어서 정리한다.1. 2PL 프로토콜 (Two-Phase Locking)2PL 프로토콜(Two-Phase Locking Protocol, 2단계 잠금 프로토콜)은 lock을 사용해도 직렬화가 보장되지 않는 문제를 해결하기 위한 규약이다. 핵심 규칙은 다음과 같다.트랜잭션에서 모든 locking operation이 최초의 unlock operation보다 먼저 수행되어야 한다.즉, lock을 취득하는 단계와 반환하는 단계를 엄격히 분리한다.Expanding phase (Growing pha..

[데이터베이스 응용] DB 스냅샷과 Locking 기법

1. Snapshot IsolationSnapshot Isolation이란 트랜잭션이 실행되는 동안 다른 트랜잭션에 의해 수정된 데이터를 볼 수 없게 보장하는 격리 수준이다. 동시성 문제를 해결하면서도 성능을 최적화하는 방식으로, 많은 상업용 DBMS에서 실제로 사용한다.스냅샷(Snapshot)이란?스냅샷은 트랜잭션이 시작된 시점의 데이터 상태를 기준으로 읽도록 하는 논리적인 데이터 시점이다. 즉, 트랜잭션이 시작될 때의 DB 모습이다. 트랜잭션은 자신이 시작된 이후에 다른 트랜잭션이 변경한 데이터를 보지 못하고, 시작 시점의 스냅샷을 기준으로 데이터를 읽는다.2. Snapshot Isolation의 핵심 규칙First-Committer-Wins두 트랜잭션이 같은 데이터를 수정하려고 하면, 먼저 co..

[데이터베이스 응용] SQL 표준에 없는 이상 현상들

이전 포스팅에서 SQL 표준이 정의한 세 가지 이상 현상(Dirty Read, Non-Repeatable Read, Phantom Read)과 네 단계의 격리 수준을 정리했다. 하지만 1995년에 발표된 논문 "A Critique of ANSI SQL Isolation Levels"은 SQL 표준의 한계를 지적하며, 이상 현상이 세 가지만 있는 것이 아니라고 비판했다. 또한 상업적 DBMS에서 실제로 사용하는 방법을 반영하지 않고 격리 수준을 구분한 문제도 제기했다. 이번 포스팅에서는 표준에 포함되지 않은 이상 현상들에 대해 알아본다.1. Dirty Writex = 0인 상태에서 트랜잭션 1은 x를 10으로, 트랜잭션 2는 x를 100으로 바꾸는 상황이다.초기 상태: x = 0T1: write(x = 1..

[데이터베이스 응용] 트랜잭션 격리성(Isolation Level)과 이상 현상

동시성 제어는 직렬화 가능성(Serializability)과 회복 가능성(Recoverability)을 보장한다. 이를 통해 트랜잭션의 격리성(Isolation)을 구현하는데, DB 엔진마다 제공되는 격리 수준이 다르다는 점에 주의해야 한다. 다만 SQL 표준에서 정의한 격리 수준이 존재하며, 이번 포스팅에서는 이 표준 격리 수준과 각 수준에서 발생할 수 있는 이상 현상들을 정리해 본다.1. Dirty Readx = 10, y = 20인 상태에서 트랜잭션 1은 x에 y를 더하고, 트랜잭션 2는 y를 70으로 바꾸는 상황을 살펴보자.초기 상태: x = 10, y = 20T1: read(x) => 10T2: write(y = 70)T1: read(y) => 70 ← comm..

[데이터베이스 응용] Conflict Serializable과 Recoverability

지난 포스팅에서는 트랜잭션의 직렬화와 스케줄의 개념을 다뤘다. 이번에는 한 단계 더 깊이 들어가서, 두 연산 사이의 충돌이 무엇인지, 스케줄이 충돌 직렬화 가능(Conflict Serializable)한지 판별하는 방법, 그리고 회복 가능성에 대해 정리해 본다.1. 두 연산의 충돌(Conflict of Two Operations)두 연산이 충돌한다는 것은 다음 세 가지 조건을 모두 만족하는 경우를 말한다.서로 다른 트랜잭션에 소속되어 있고같은 데이터에 접근하며최소 하나는 write 연산이다예를 들어 sched.3에서 트랜잭션 1과 트랜잭션 2가 모두 데이터 H에 접근하고, 그 중 write 연산이 포함되어 있다면 이 연산 쌍은 충돌 관계에 있다. 충돌 연산의 핵심 성질충돌 연산은 순서가 바뀌면 결과..

[데이터베이스 응용] 트랜잭션과 직렬화

데이터베이스에서 여러 트랜잭션이 동시에 실행될 때, 결과가 올바르게 나온다는 보장이 있을까? 이 질문에 대한 답이 바로 직렬화(Serializability)다. 이번 포스팅에서는 Undo/Redo 복습부터 트랜잭션의 ACID 속성, 그리고 Schedule과 직렬화 개념까지 한 번에 정리해 본다.1. Undo와 Redo 복습Undo (취소)Undo는 잘못된 트랜잭션을 취소하고 원래 상태로 되돌리는 것이다. 트랜잭션이 완전히 완료되지 않았거나 실패한 경우, 변경하기 전에 저장된 상태로 되돌린다. 사용 시점은 트랜잭션이 완료되지 않았거나 commit되지 않은 상태에서 장애가 발생했을 때다. 트랜잭션이 변경한 데이터를 이전 값(로그에 기록된 값)으로 되돌려 데이터베이스의 일관성을 유지한다.START TRANS..

[데이터베이스 응용] 트랜잭션 회복 기법

데이터베이스 시스템에서 트랜잭션의 안전한 실행은 핵심 중의 핵심이다. 아무리 잘 설계된 시스템이라도 장애는 언제든 발생할 수 있고, 이때 데이터의 일관성을 어떻게 지킬 것인지가 바로 회복(Recovery) 기법의 영역이다.이번 포스팅에서는 트랜잭션의 기본 구조부터 로그 기반 회복 기법, 검사 시점 회복, 미디어 회복까지 한 번에 정리해 본다.1. 트랜잭션 기본 구조실제 애플리케이션에서 트랜잭션을 어떻게 처리하는지 파이썬 코드로 먼저 살펴보자. try / except 구조를 사용하여 성공 시 commit, 실패 시 rollback을 수행한다.import pymysqlconn = pymysql.connect( host="localhost", user="root", password="1234..

반응형