본문 바로가기

카테고리 없음

트랜잭션(Transaction)은 데이터베이스 시스템

트랜잭션(Transaction)**은 데이터베이스 시스템에서 데이터베이스의 상태를 변환하는 하나의 작업 단위를 나타냅니다. 트랜잭션은 데이터베이스에서의 작업을 일관되게 수행하기 위해 일련의 연산들을 묶어 관리하는 메커니즘을 제공합니다. 데이터베이스 트랜잭션은 ACID 속성을 만족해야 합니다.

트랜잭션의 ACID 속성

  1. 원자성 (Atomicity):
    • 트랜잭션은 원자적으로 실행되어야 합니다. 즉, 트랜잭션 내의 모든 작업이 완전히 실행되거나 전혀 실행되지 않아야 합니다. 중간 상태는 허용되지 않습니다. 예를 들어, 은행 계좌 이체 작업에서 돈을 송금하고 받는 두 작업이 포함될 때, 둘 중 하나라도 실패하면 전체 작업이 취소되어야 합니다.
  2. 일관성 (Consistency):
    • 트랜잭션이 완료되면 데이터베이스는 일관된 상태를 유지해야 합니다. 데이터베이스의 제약 조건과 규칙이 트랜잭션 후에도 유지되어야 합니다. 트랜잭션의 실행 전후로 데이터베이스의 상태가 변하지 않아야 합니다.
  3. 격리성 (Isolation):
    • 동시에 실행되는 트랜잭션들은 서로에게 영향을 미치지 않아야 합니다. 하나의 트랜잭션이 완료될 때까지 다른 트랜잭션은 그 트랜잭션의 변경 사항을 볼 수 없습니다. 격리 수준에 따라 동시성 문제를 해결합니다.
  4. 지속성 (Durability):
    • 트랜잭션이 완료되면 그 결과는 영구적으로 데이터베이스에 저장되어야 합니다. 시스템 장애가 발생해도 완료된 트랜잭션의 변경 사항은 유지됩니다.

트랜잭션의 상태

트랜잭션은 여러 상태를 가질 수 있습니다:

  1. 활성 (Active): 트랜잭션이 시작되었지만 아직 완료되지 않은 상태입니다.
  2. 커밋 (Committed): 트랜잭션이 성공적으로 완료되어 데이터베이스에 영구적으로 적용된 상태입니다.
  3. 롤백 (Rolled Back): 트랜잭션이 실패하여 모든 변경 사항이 취소되고, 데이터베이스가 이전 상태로 복원된 상태입니다.
  4. 준비 (Prepared): 분산 트랜잭션에서 트랜잭션이 준비 상태로, 모든 참여자가 트랜잭션을 커밋할 준비가 된 상태입니다.

트랜잭션 제어 명령어

  1. BEGIN TRANSACTION:
    • 트랜잭션의 시작을 명시합니다. 일부 데이터베이스 시스템에서는 START TRANSACTION 또는 BEGIN 명령어를 사용합니다.
    sql
    코드 복사
    BEGIN TRANSACTION;
  2. COMMIT:
    • 트랜잭션의 모든 작업을 데이터베이스에 영구적으로 적용합니다. 트랜잭션이 성공적으로 완료되었을 때 사용합니다.
    sql
    코드 복사
    COMMIT;
  3. ROLLBACK:
    • 트랜잭션이 실패했을 때, 트랜잭션이 시작되기 전의 상태로 데이터를 되돌립니다. 모든 변경 사항이 취소됩니다.
    sql
    코드 복사
    ROLLBACK;
  4. SAVEPOINT:
    • 트랜잭션 내에서 중간 상태를 저장하여, 트랜잭션의 특정 지점으로 되돌릴 수 있도록 합니다.
    sql
    코드 복사
    SAVEPOINT savepoint_name; ROLLBACK TO SAVEPOINT savepoint_name;

트랜잭션의 격리 수준

트랜잭션의 격리 수준은 동시 실행되는 트랜잭션 간의 상호작용을 제어합니다. 격리 수준은 트랜잭션의 성능과 일관성 간의 균형을 맞추는 데 도움을 줍니다. 주요 격리 수준은 다음과 같습니다:

  1. 읽기 미확인 (Read Uncommitted):
    • 트랜잭션이 아직 커밋되지 않은 변경 사항도 다른 트랜잭션에서 읽을 수 있습니다. 가장 낮은 격리 수준으로, 더티 읽기(Dirty Read)가 발생할 수 있습니다.
  2. 읽기 확인 (Read Committed):
    • 트랜잭션이 커밋된 데이터만 읽을 수 있습니다. 더티 읽기는 방지되지만, 비 반복 읽기(Non-repeatable Read)가 발생할 수 있습니다.
  3. 반복 가능한 읽기 (Repeatable Read):
    • 트랜잭션이 시작된 시점의 데이터 상태를 보장합니다. 더티 읽기와 비 반복 읽기는 방지되지만, 팬텀 읽기(Phantom Read)가 발생할 수 있습니다.
  4. 직렬화 (Serializable):
    • 가장 높은 격리 수준으로, 트랜잭션들이 직렬화된 것처럼 작동하여 동시성 문제를 완전히 방지합니다. 모든 읽기와 쓰기가 순차적으로 발생하는 것처럼 보장됩니다.

트랜잭션의 중요성

트랜잭션은 데이터베이스에서 데이터의 무결성과 일관성을 유지하는 데 필수적입니다. ACID 속성을 충족하는 트랜잭션은 시스템의 신뢰성을 높이고, 여러 사용자가 동시에 데이터를 처리할 때 발생할 수 있는 문제를 해결합니다. 트랜잭션을 통해 복잡한 데이터베이스 작업을 안전하게 수행하고, 시스템 장애나 오류로부터 데이터베이스를 보호할 수 있습니다.