DB 트랙잭션(Transaction)이란

김진아·2024년 9월 4일

CS

목록 보기
13/15

트랜잭션이란?


데이터베이스의 시스템에서 여러 개의 데이터 조작 작업을 하나의 작업 단위로 묶어서 수행하는 것을 말한다.



트랜잭션의 목적


데이터베이스의 일관성을 유지하고, 데이터베이스 시스템의 신뢰성을 보장하는 것이다. 이를 위해 트랜잭션은 ACID 원칙을 따른다.



ACID는 무엇인가?


ACID는 원자성(Atomicity), 일관성(Consistency), 격리성/고립성(Isolation), 지속성(Durability)의 첫 글자를 딴 축약단어이다.

1. 원자성

원자성은 트랜잭션 내의 모든 작업이 하나의 단위로 처리되며, 중간에 오류가 발생하면 모든 작업이 취소되어 트랜잭션이 시작되기 전 상태로 돌아가야 한다는 원칙이다. 이를 통해 데이터베이스의 상태가 불완전한 중간 상태에 놓이지 않도록 보장한다.

예시: 은행 계좌에서 돈을 송금하는 트랜잭션
송금 트랜잭션은 두 개의 작업을 포함한다. 돈을 송신 계좌에서 차감하고, 수신 계좌에 돈을 추가하는 것이다. 원자성이 보장되면, 두 작업이 모두 성공해야만 데이터베이스가 변경된다. 만약 송신 계좌에서 돈을 차감하는 작업은 성공했지만, 수신 계좌에 추가하는 작업이 실패하면 전체 트랜잭션이 롤백(취소)되어, 송금 전 상태로 복구된다.


2. 일관성

일관성은 트랜잭션이 실행되기 전과 후에 데이터베이스가 무결성 제약 조건을 지켜야 한다는 원칙이다. 즉, 트랜잭션이 시작되기 전에 데이터베이스는 유효한 상태여야 하고, 트랜잭션이 완료된 후에도 데이터베이스는 유효한 상태를 유지해야 한다.

예시: 은행 계좌 잔액
은행 계좌에서, 모든 계좌의 잔액이 음수가 될 수 없다는 제약 조건이 있을 때, 송금 트랜잭션이 성공적으로 완료되면 모든 계좌의 잔액이 이 제약 조건을 만족해야 한다. 트랜잭션이 일관성을 유지하도록 보장한다.


3. 격리성/고립성

격리성은 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 보장한다. 트랜잭션이 실행될 때, 그 결과는 다른 트랜잭션이 완료될 때까지 외부에 노출되지 않는다. 격리성은 여러 트랜잭션이 동시에 수행될 때 데이터의 무결성을 유지하는 데 중요하다.

예시: 두 명의 사용자가 동일한 계좌에서 동시에 돈을 인출할 때
두 명의 사용자가 동일한 계좌에서 동시에 돈을 인출할 때 격리성이 보장되면, 각 트랜잭션은 독립적으로 실행되며, 각 트랜잭션은 데이터베이스의 현재 상태만 참조한다. 따라서 두 트랜잭션이 동시에 실행되어도 데이터베이스는 일관된 상태를 유지할 수 있다.


4. 지속성

지속성은 트랜잭션이 완료되면 그 결과가 영구적으로 저장되며, 시스템 장애가 발생해도 데이터가 손실되지 않는다는 원칙이다. 즉, 트랜잭션이 성공적으로 완료된 후에는 데이터베이스의 상태가 지속적으로 유지된다.

예시: 은행 송금중에 시스템 오류가 났을 때
은행의 송금 트랜잭션이 완료된 후, 시스템 장애가 발생하더라도 송금한 금액은이미 수신 계좌에 반영된 상태로 남아야 한다. 이는 지속성 원칙을 통해 보장된다.



트랜잭션의 상태


Active(활성)

트랜잭션이 시작되었고 현재 진행 중인 상태이다.

Committed(커밋됨)

트랜잭션이 성공적으로 완료되어 데이터베이스에 영구적으로 저장된 상태이다.

Aborted(중단됨)

트랜잭션이 실패하거나 취소되어, 데이터베이스의 상태가 트랜잭션 시작 전으로 되돌려진 상태이다.



트랜잭션의 구현


트랜잭션의 구현은 데이터베이스 관리 시스템(DBMS)이 트랜잭션의 ACID 원칙을 보장하기 위해 사용하는 여러 기술적 접근 방식을 포함한다. 트랜잭션이 안정적으로 처리되도록 하기 위해 DBMS는 다양한 방법을 사용하여 데이터의 무결성과 일관성을 유지한다. 주요 구현 기술은 아래의 5가지가 있다.

1. 로그(Logging)

트랜잭션의 로그는 트랜잭션의 모든 작업을 기록하여 데이터베이스의 상태를 추적하는 데 사용된다. 로그는 두 가지 주요 목적을 가지고 있다.

  • 복구(Recovery): 시스템 장애가 발생했을 때, 로그를 사용하여 트랜잭션을 롤백하거나 커밋하여 데이터베이스를 일관된 상태로 복구한다.
  • 트랜잭션의 일관성 보장: 로그를 통해 트랜잭션이 수행한 모든 변경 사항을 기록함으로써, 데이터베이스의 일관성을 보장한다.
    로그의 두 가지 주요 종류는 다음과 같다.
    • 알로우드 로드(Write-Ahead Log, WAL): 로그 항목이 실제 데이터 파일에 적용되기 전에 먼저 로그 파일에 기록된다. 이는 시스템이 중단되었을 때 데이터를 복구할 수 있게 한다.
    • 로그 스크립트(Log File): 트랜잭션의 모든 작업이 기록된 파일로, 이 파일을 통해 트랜잭션의 상태를 추적하고, 필요한 경우 롤백 및 복구를 수행한다.

2. 체크포인트(Checkpoint)

체크포인트는 데이터베이스의 현재 상태를 특정 시점에 저장하는 과정이다. 체크포인트는 데이터베이스 복구를 간소화하고, 장애 발생 시 복구 시간을 줄이기 위해 사용된다.
주요 기능은 다음과 같다.

  • 지속적 상태 저장: 체크포인트는 로그의 범위를 제한하여 시스템 장애 시 복구할 데이터의 양을 줄인다. 체크포인트 이후의 로그만을 분석하면 된다.

3. 로킹(Locking)

트랜잭션이 데이터에 접근할 때 다른 트랜잭션이 동시에 접근하지 못하도록 잠금을 설정한다. 이는 동시성 문제를 해결하여 데이터의 무결성을 보장한다. 여러 트랜잭션이 동시에 실행되더라도 데이터의 일관성과 충돌을 방지한다.
주요 기능은 다음과 같다.

  • 공유 잠금(Shared Lock): 여러 트랜잭션이 동시에 읽을 수 있지만, 쓰기는 불가능하다.
  • 배타 잠금(Exclusive Lock): 한 트랜잭션만 데이터에 접근할 수 있으며, 다른 트랜잭션은 읽거나 쓸 수 없다.

4. 다단계 복구 기법(Multi-Version Concurrency Control, MVCC)

데이터의 여러 버전을 관리하여, 각 트랜잭션이 데이터의 특정 시점에 대한 스냅샷을 사용한다. 이는 동시성 문제를 해결하고 트랜잭션 간의 충돌을 방지한다. MVCC는 트랜잭션이 데이터의 일관된 스냅샷을 읽도록 하여, 다른 트랜잭션의 변경 사항이 영향을 미치지 않도록 한다.



트랜잭션 제어 명령어


데이터베이스에서 트랜잭션을 시작하고, 커밋하거나 롤백하여 트랜잭션의 결과를 확정하거나 취소하는데 사용된다. 각각의 명령어는 특정 상황에서 데이터베이스 작업의 완료 또는 취소를 명시하는데 중요하며, 대부분의 DBMS에서 공통적으로 지원하고 각 DBMS에 따라 명령어의 구문이 조금씩 다르다.

제어 명령어는 다음과 같다.

BEGIN TRANSACTION

트랜잭션을 시작하고, 여러 작업을 하나의 단위로 묶는다.

COMMIT

트랜잭션의 모든 작업이 성공적으로 완료되었을 때, 변경 사항을 데이터베이스에 저장한다.

ROLLBACK

트랜잭션의 작업 중 오류가 발생했을 때, 변경 사항을 취소하고 데이터베이스를 원래 상태로 되돌린다.

이러한 명령어들을 적절히 사용하여 트랜잭션의 일관성과 안정성을 보자할 수 있다.

profile
https://develop-chick.tistory.com/ 첫번째 블로그

0개의 댓글