트랜잭션은 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말하며 데이터베이스에 접근하는 방법은 쿼리이므로, 즉 여러 개의 쿼리들을 하나로 묶는 단위를 말한다. 이에 대한 특징은 원자성, 일관성, 독립성, 지속성이 있으며 이를 한꺼번에 ACID 특징이라고 한다. 주요 목적은 여러 작업이 포함된 프로세스에서 데이터 무결성을 보장하고, 시스템 장애나 에러 발생 시 일관된 상태로 복원할 수 있게 하는 것이다.
트랜잭션의 주요 특징 (ACID 속성)
트랜잭션은 ACID 속성이라고 불리는 네 가지 특징을 가지고 있다.
1. Atomicity (원자성)
트랜잭션 내의 모든 작업은 하나의 단위로 간주된다. 따라서 트랜잭션 내의 작업이 모두 성공하든지, 모두 실패하든지 해야 한다. 일부만 성공하거나 실패할 수 없으며, 작업 중 하나라도 실패하면 전체 트랜잭션이 취소되고 이전 상태로 되돌아간다.
예를 들어 1000만원을 가진 홍철이가 0월을 가진 규영이에게 500만원을 이체한다고 해보자. 그렇다면 결과는 홍철이는 500만원, 규영이는 500만원을 가지게된다. 해당 결과는 다음과 같은 operation 단위들로 이루어진 과정을 거친다.
1. 홍철의 잔고를 조회한다.
2. 홍철에게서 500만원을 뺀다.
3. 규영에게 500만원을 넣는다.
여기서 1~3의 operation 중 데이터베이스 사용자는 이 세 가지의 과정을 볼 수도 참여할 수도 없습니다. 다만 이 과정이 모두 끝난 이후의 상황인 홍철 500만원, 규영 500만원인 상황만 보는 것이다. 만일 해당 작업을 '취소'한다고 했을 때 홍철이는 다시 1000만원, 규영이는 0원을 가져야 한다. 일부 operation만 적용된 홍철이는 500만원, 규영이는 0원이 되지 않는 것을 의미한다. 그래서 트랜잭션은 모두 성공하거나 모두 실패해야 한다.
트랜잭션의 주요 과정
- 트랜잭션 시작: 트랜잭션이 시작되면 데이터베이스는 사용자의 요청에 따라 데이터 수정, 삭제, 삽입 등의 작업을 수행한다.
- 작업 수행: 트랜잭션 내에서 여러 작업이 수행됩니다. 이 작업들은 하나의 논리적 단위로 간주되며, 트랜잭션 전체가 성공적으로 끝나거나 실패할 수 있다.
- 커밋(Commit): 트랜잭션 내 작업이 모두 성공하면, 트랜잭션을 커밋하여 데이터베이스에 모든 변경 사항을 반영합니다. 이때부터 변경된 데이터는 영구적이다.
- 롤백(Rollback): 트랜잭션 중 하나라도 실패하면, 트랜잭션을 롤백하여 모든 작업을 취소하고 데이터베이스를 트랜잭션 이전 상태로 되돌린다

이러한 동작 때문에 트랜잭션은 데이터 무결성과 일관성을 보장하는 데 매우 중요하다. 이를 통해 데이터베이스가 여러 사용자에 의해 동시에 접근되더라도 항상 올바르고 일관된 상태를 유지가 가능하다.
- 데이터 무결성 보장: 여러 작업이 하나의 트랜잭션으로 묶일 때, 중간에 하나의 작업이 실패하더라도 다른 작업이 이미 실행된 경우를 방지한다.
- 시스템 복구 가능성: 트랜잭션을 통해 시스템 장애나 에러 발생 시 데이터베이스를 안전하게 복구할 수 있다.
2. 일관성(Consistence)
데이터베이스에서 매우 중요한 개념이며, 트랜잭션이 시작되기 전과 끝난 후에 데이터가 유효한 상태를 유지하는 것을 의미한다. 이는 트랜잭션이 데이터 베이스 규칙이나 제약 조건을 위반하지 않고 정상적으로 처리되어야 한다는 것을 보장한다.
일관성의 의미
데이터베이스는 여러 가지 제약 조건과 규칙을 가지고 있다 예를 들어
- 무결성 제약: 특정 필드에 NULL 값을 허용하지 않음.
- 외래 키 제약: 테이블 간의 관계를 유지하지 위해 외래 키 값이 유효해야 함.
- 유니크 제약: 특정 컬럼에 중복된 값이 없어야 함.
그래서 일관성은 트랜잭션이 이 제약 조건들을 항상 만족하도록 보장한다. 즉, 트랜잭션이 시작된 때 데이터가 유효한 상태라면, 트랜잭션이 끝난 후에도 데이터는 유효한 상태여야 한다.
돈으로 예를 들면
계좌 A에는 500,000만원이 있고, 계좌 B에는 300,000원이 있다. 계좌 A에서 100,000원을 차감하고 계좌 B에서 100,000원을 추가한다. 그렇게 되면 계좌 A에는 400,000원이 남아있고, 계좌 B에는 400,000원이 있어야 일관성이 유지된다.
만일 트랜잭션 도중 오류가 발생해 계좌 A에서 돈이 빠졌는데, 계좌 B에 돈을 추가되지 않는 경우, 데이터가 일관성을 잃게 된다. 이때 롤백이 실행되면 계좌 A의 금액이 원래대로 돌아가 데이터 일관성이 유지된다.
3. 격리성(isolation)
격리성은 트랜잭션이 독립적으로 실행되도록 보장하는 데이터베이스의 중요한 속성 중 하나이다. 격리성은 여러 트랜잭션이 동시에 실행될 때 각 트랜잭션이 다른 트랜잭션에 영향을 받지 않도록 하는 것을 의미한다. 즉, 트랜잭션이 진행되는 동안에는 다른 트랜잭션이 그 데이터를 읽거나 수정할 수 없도록 보호하여, 데이터의 무결성을 유지한다.
격리성이 왜 필요하냐?
동시성 제어가 필요한 시스템에서는 여러 사용자가 동시에 데이터를 읽거나 수정할 수 있다. 이 경우 격리성이 없다면 해당 문제가 발생한다.
- Dirty Read: 트랜잭션이 아직 완료되지 않은 데이터를 다른 트랜잭션에서 읽는 상황.
- Non-repeatable Read: 한 트랜잭션에서 읽은 데이터를 같은 트랜잭션 내에서 다시 읽을 때 값이 달라지는 상황.
- Phantom Read: 한 트랜잭션이 데이터를 읽을 때, 다른 트랜잭션이 새로운 데이터를 추가하여 다시 조회할 때 결과 집합이 달라지는 상황이다.
이러한 문제를 방지하기 위해 격리성을 적용해 트랜잭션 간의 간섭을 최소화한다.
격리 수준(단계)
데이터베이스는 성능과 동시성 제어의 균형을 맞추기 위해 다양한 격리 수준을 제공한다. 격리 수준은 트랜잭션 간의 간섭을 얼마나 허용할지 결정하며, 각 수준은 동시성 문제를 해결하는 정도에 따라 구분된다. 따라서 데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야 한다.
격리성은 여러 개의 격리 수준으로 나뉘어 격리성을 보장한다.
1. Read Uncommitted (읽기 미완료, 커밋되지 않은 읽기)
트랜잭션이 커밋되지 않은 데이터를 다른 트랜잭션에서 읽을 수 있다. 즉, 한 트랜잭션이 데이터를 변경 중일 때, 다른 트랜잭션에서 그 변경된 데이터를 읽을 수 있다.
- 특징: Dirt Read 발생 가능성이 있다.
- 사용 예시: 성능이 매우 중요한 시스템에서 일시적인 데이터 불일치가 허용될 때 사용.
2. Read Committed (읽기 완료, 커밋된 읽기)
트랜잭션이 완료된(커밋된) 데이터만 읽을 수 있다. 트랜잭션이 진행되는 동안에는 다른 트랜잭션이 그 데이터에 접근할 수 없지만, 커밋되면 읽을 수 있다.
- 특징: Dirty Read는 방지되지만, Non-repeatable나 Phantom Read는 발생할 수 있다.
- 사용 예시: 대부분의 데이터베이스에서 기보능로 설정된 격리 수준이다. 일반적으로 비즈니스 애플리케이션에서 많이 사용된다.
3. Repeatable Read (반복 가능 읽기)
한 트랜잭션이 시작된 후, 동일한 데이터를 여러 번 읽어도 값이 변하지 않도록 보장한다. 즉, 트랜잭션이 완료될 때까지 다른 트랜잭션이 해당 데이터를 변경할 수 없다.
- 특징: Non-repeated Read는 방지되지만, Phantom Read는 여전히 발생할 수 있다.
- 사용 예시: 높은 수준의 데이터 무결성이 필요할 때 사용된다.
4. Serializable (직렬화 가능)
가장 높은 수준의 격리성으로, 모든 트랜잭션을 순차적으로 실행하는 것처럼 보이게 만든다. 즉, 한 트랜잭션이 완료되기 전에는 다른 트랜잭션이 그 데이터에 접근할 수 없다.
- 특징: Dirty Read, Non-repeatable Read, Phantom Read를 모두 방지한다. 그러나 성능 저하가 발생한다.
- 사용 예시: 데이터의 완전한 일관성이 요구되는 경우(예: 은행 거래 시스템) 사용된다.

-동시성(Concurrency): 여러 작업이나 프로세스가 동일한 자원(예: 데이터베이스)에 동시에 접근하거나 실행되는 상황을 의미한다.
격리 수준 | Dirty Read 방지 | Non-repeatable Read 방지 | Phantom Read 방지 |
Read Uncommitted | X | X | X |
Read Committed | O | X | X |
Repeatable Read | O | O | X |
Serializable | O | O | O |
4. 지속성(Durability)
데이터 베이스 트랜잭션에서 매우 중요한 개념으로, 트랜잭션이 성공적으로 커밋된 후에는 시스템 오류나 정전 등의 문제가 발생하더라도 그 데이터가 영구적으로 저장된다는 것을 의미한다. 즉, 일단 트랜잭션이 완료되고 나면, 해당 데이터는 안전하게 저장되어 사라지지 않으며, 시스템이 다시 시작되더라도 해당 데이터는 계속 유지된다. 이를 위해 데이터베이스는 체크섬, 저널링, 롤백 등의 기능을 제공한다.
지속성의 핵심 개념
- 트랜잭션 커밋: 트랜잭션이 완료되고 커밋이 되면, 그 결과는 데이터베이스에 영구적으로 반영이된다.
- 데이터 보호: 하드웨어 오류, 소프트웨어 문제, 전원 장애 등 다양한 문제로 인해 데이터 손실이 발생할 수 있는 상황에서도, 트랜잭션이 완료된 데이터는 반드시 보호된다.
- 로그 및 백업: 대부분의 데이터베이스는 트랜잭션 로그(redo log)를 사용하여 지속성을 보장한다. 트랜잭션이 완료되면 해당 트랜잭션의 세부 정보가 로그 파일에 기록되고, 시스템 장애 시 로그를 통해 복구가 가능하다.
예시로 보는 지속성
은행 시스템 예시
고객이 은행 계좌에서 돈을 이체할 때, 트랜잭션이 성공적으로 완료되고 커밋되면, 해당 금액은 영구적으로 이체됩니다. 만약 시스템 장애가 발생하거나 전원이 꺼지더라도, 트랜잭션이 커밋되었다면 이체 정보는 안전하게 보존되어 재부팅 후에도 데이터베이스에서 확인할 수 있다.
온라인 쇼핑몰 예시
고객이 주문을 완료하고 결제가 성공하면 트랜잭션이 커밋된다. 만약 서버 장애가 발생하더라도 주문 내역은 로그에 기록되고 데이터베이스에 안전하게 저장되어, 고객의 주문이 사라지지 않는다.
지속성의 중요성
지속성은 데이터를 신뢰할 수 있도록 보장하는 핵심 요소이다. 특히 은행, 금융, 전자상거래와 같은 시스템에서 데이터 손실은 심각한 문제가 될 수 있다. 데이터가 영구적으로 저장되지 않으면 트랜잭션의 결과가 유실될 수 있어, 비즈니스 신뢰성과 서비스 안정성에 큰 영향을 미친다. 지속성을 통해 데이터 손실을 방지하고 시스템 장애 시에도 트랜잭션의 결과를 보존할 수 있다.
지속성의 장점
- 데이터 안전성 보장: 트랜잭션이 완료되면 그 결과는 항상 영구적으로 저장되므로 데이터 손실 위험을 방지한다.
- 장애 복구 가능: 장애가 발생해도 로그를 통해 트랜잭션을 복구할 수 있어 시스템이 안정적으로 동작할 수 있다.
- 신뢰성: 사용자는 시스템이 장애가 발생하더라도 데이터가 안전하게 보존된다는 신뢰를 가질 수 있습니다.
지속성은 트랜잭션의 ACID 특성 중 마지막 요소로, 트랜잭션의 결과가 시스템 장애에도 불구하고 영구히 유지됨으로써 데이터의 일관성과 무결성을 보장하는 매우 중요한 개념이다.
무결성(Integrity)
데이터베이스 시스템에서 데이터의 정확성, 일관성, 신뢰성을 유지하는 중요한 원칙입니다. 무결성은 잘못된 데이터가 데이터베이스에 저장되지 않도록 하고, 데이터가 저장된 후에도 오류나 불일치가 발생하지 않도록 보장합니다. 무결성의 목적은 데이터의 신뢰성을 보장하여, 시스템이 언제나 정확하고 신뢰할 수 있는 데이터를 다루도록 하는 것입니다.
무결성의 종류
1. 개체 무결성(Entity Integrity)
개체 무결성은 테이블 내에서 각 레코드(행)를 고유하게 식별하기 위해 기본 키(Primary Key)를 사용하는 것을 말한다. 기본 키는 테이블에서 각 행을 유일하게 식별할 수 있는 값이어야 하며, 중복되거나 NULL 값을 가질 수 없습니다. 이를 통해 한 테이블 내에서 동일한 데이터가 중복 저장되거나, 식별할 수 없는 레코드가 발생하지 않도록 보장한다.
ex)
사용자 테이블의 user_id 필드가 기본 키로 설정되어 있으면, user_id는 중복되지 않고, 모든 사용자에 대해 고유한 값이어야 하며, NULL이 될 수 없다.
CREATE TABLE Users (
user_id INT PRIMARY KEY,
username VARCHAR(255),
email VARCHAR(255)
);
2. 참조 무결성(Referential Integrity)
참조 무결성은 테이블 간의 외래 키(Foreign Key) 관계를 유지하여 데이터 간의 참조가 올바르게 연결되는 것을 보장한다. 외래 키는 한 테이블에서 다른 테이블의 기본 키를 참조하는데, 외래 키는 참조된 테이블의 기본 키 값과 일치하거나, NULL이 될 수 있다. 참조 무결성을 통해 외래 키로 참조된 레코드가 존재해야만 외래 키 값이 유효하게 된다.
참조 무결성의 역할:
- 삭제 또는 수정 규칙을 통해 참조된 데이터가 변경되거나 삭제될 때 관련 데이터를 어떻게 처리할지 결정할 수 있다(예: ON DELETE CASCADE).
ex)
Orders 테이블의 user_id는 Users 테이블의 기본 키를 참조하는 외래 키이다. user_id 값이 존재하지 않는 사용자에게 주문을 생성할 수 없다.
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
user_id INT,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
3. 고유 무결성(Unique Integrity)
고유 무결성은 고유한 값을 가져야 하는 열에 적용되며, 중복된 값을 허용하지 않는 제약 조건이다. 기본 키는 자동으로 고유성을 가지지만, 추가적으로 고유 제약 조건을 적용하고 싶은 열에는 UNIQUE 제약 조건을 사용할 수 있다. 고유 무결성은 기본 키와 달리 NULL 값을 허용할 수 있지만, 그 값이 존재할 경우에는 유일해야 한다.
ex)
email 필드에 고유 무결성 제약을 걸면, 같은 이메일 주소를 가진 사용자가 여러 번 등록되지 않도록 보장할 수 있다.
CREATE TABLE Users (
user_id INT PRIMARY KEY,
email VARCHAR(255) UNIQUE
);
4. NULL 무결성(NULL Integrity)
NULL 무결성은 NULL 값을 허용하지 않는 제약 조건이다. 특정 열에 반드시 값이 있어야 할 때 사용되며, NOT NULL 제약 조건을 사용하여 설정된다. 이를 통해 해당 열이 반드시 값이 입력되도록 강제할 수 있다.
ex)
username 필드는 NULL 값이 허용되지 않도록 설정되어야 할 경우, 사용자가 회원가입 시 반드시 username을 입력하도록 강제할 수 있다.
CREATE TABLE Users (
user_id INT PRIMARY KEY,
username VARCHAR(255) NOT NULL
);
이름 | 설명 |
개체 무결성 | 기본키로 선택된 빈 값을 허용하지 않는다. |
참조 무결성 | 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 한다. |
고유 무결성 | 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우 그 속성 값은 모두 고유한 값을 가진다. |
NULL 무결성 | 특정 속성 값에 NULL이 올 수 없다는 조건이 주어진 경우 그 속성 값은 NULL이 될 수 없다는 제약 조건이다. |
무결성의 중요성
- 데이터 신뢰성: 무결성을 유지하면 시스템이 항상 신뢰할 수 있는 데이터를 처리하게 되어, 잘못된 데이터로 인한 오류를 방지함.
- 데이터 일관성: 무결성은 여러 테이블 간의 관계를 정확하게 유지하고, 데이터의 일관성을 보장하여 데이터베이스가 혼란스럽거나 불완전해지는 것을 막는다.
- 오류 방지: 무결성 제약을 적용하면 잘못된 입력이나 데이터 손상을 예방할 수 있으며, 시스템이 데이터를 다루는 과정에서 오류를 줄일 수 있다.
무결성은 데이터베이스 설계 시 매우 중요한 요소로, 데이터의 품질을 유지하고 시스템의 안정성을 높이는 데 필수적인 역할을 한다!
'Computer Science' 카테고리의 다른 글
선형 자료 구조: 연결 리스트, 배열, 백터 (0) | 2024.09.28 |
---|---|
자료 구조 - 복잡도 (0) | 2024.09.21 |
CPU 스케줄링 알고리즘 (7) | 2024.09.07 |
메모리(Memory) (6) | 2024.09.01 |
Stack, Method, Heap 메모리 (0) | 2024.08.11 |