ACID가 무엇일까?

박승우·2024년 8월 19일

자 89번째 키워드인 'ACID'를 알아 볼 것이다.

ACID는 트랜잭션과 연관성이 있는 키워드 이므로 트랜잭션과 연관지어 알아보았다.

ACID가 뭐에요?

ACID 속성은 데이터베이스 트랜잭션의 신뢰성과 일관성을 보장하기 위한 네 가지 핵심 속성을 말한다.
각각의 속성은 데이터베이스 시스템이 트랜잭션을 처리할 때 반드시 준수해야 할 규칙들을 정의한다.

우선 ACID를 알기 위해서 트랜잭션부터 알아보았다.

트랜잭선에 대해서

개념

  • 트랜잭션은 데이터베이스에서 하나의 논리적 작업 단위로, 여러 개의 연관된 데이터베이스 작업들을 하나로 묶은 것이다.

  • 트랜잭션은 데이터베이스의 일관성을 유지하기 위해 ACID 속성(원자성, 일관성, 독립성, 지속성)을 만족해야 한다.

  • 일반적으로 트랜잭션은 데이터베이스에 대한 여러 개의 연산(예: 데이터 삽입, 삭제, 갱신, 조회)을 묶어 하나의 작업으로 처리하며, 이 작업은 반드시 모두 성공적으로 완료되거나 전혀 수행되지 않은 상태로 유지되어야 한다.

트랜잭션의 상태

  1. 활동 상태 (Active): 트랜잭션이 시작되고 작업이 수행되는 상태이다.

  2. 부분 완료 상태 (Partially Committed): 트랜잭션의 마지막 연산이 실행된 상태이다.

  3. 완료 상태 (Committed): 트랜잭션이 성공적으로 완료되어 그 결과가 데이터베이스에 영구적으로 반영된 상태이다.

  4. 실패 상태 (Failed): 트랜잭션이 오류로 인해 실패한 상태이다.

  5. 철회 상태 (Aborted): 트랜잭션이 실패하여 롤백된 상태이다. 트랜잭션의 모든 작업이 취소되고, 데이터베이스는 트랜잭션이 시작되기 전의 상태로 돌아간다.

트랜잭션 속성 : 원자성 (Atomicity)

  • 원자성은 트랜잭션이 "모두 수행되거나 전혀 수행되지 않아야 한다"는 속성이다.
  • 트랜잭션 내의 작업이 일부만 실행되거나 일부만 실패하는 일이 없어야 한다.
  • 트랜잭션의 모든 작업이 성공적으로 완료되면 커밋(commit)되어 데이터베이스에 영구적으로 반영된다.
  • 하나라도 실패하면 모든 작업이 원래 상태로 복구(롤백, rollback)된다.

동작 방식

  1. 트랜잭션 시작: 트랜잭션이 시작되면 DBMS는 해당 트랜잭션의 작업을 하나의 작업 단위로 관리한다.

  2. 로그 기록: 작업을 수행하면서 DBMS는 로그를 기록합니다. 이 로그는 트랜잭션이 실패할 경우, 상태를 원래대로 복구하는 데 사용된다.

  3. 커밋 또는 롤백: 모든 작업이 성공적으로 완료되면 커밋을 통해 변경 사항이 영구적으로 적용된다. 만약 어떤 작업에서 오류가 발생하면, 로그를 사용해 모든 작업이 트랜잭션 시작 전의 상태로 롤백된다.

트랜잭션 속성 : 일관성 (Consistency)

  • 일관성은 트랜잭션이 실행된 후에도 데이터베이스가 항상 일관된 상태를 유지해야 한다는 속성이다.
  • 일관성은 데이터베이스의 모든 무결성 제약 조건이 트랜잭션 전후에 유지됨을 보장한다.
  • 트랜잭션이 시작되기 전과 완료된 후의 데이터베이스 상태가 비즈니스 규칙과 제약 조건을 위반하지 않아야 한다.

동작 방식

  1. 무결성 제약 조건 검사: 트랜잭션 수행 중에 데이터베이스는 외래 키, 고유성 제약, 체크 제약 등 다양한 무결성 제약 조건을 준수하는지 검사한다.

  2. 트랜잭션 종료 시 검증: 트랜잭션이 끝난 후, 데이터베이스가 이전과 동일하게 모든 제약 조건을 만족하는지 확인한다. 만약 제약 조건이 위반되면, 트랜잭션은 롤백된다.

트랜잭션 속성 : 독립성 (Isolation)

  • 독립성은 여러 트랜잭션이 동시에 실행될 때 각 트랜잭션이 다른 트랜잭션의 중간 결과를 볼 수 없도록 보장하는 속성이다.
  • 각 트랜잭션은 독립적으로 수행되어야 하며, 동시에 수행되더라도 결과는 트랜잭션들이 순차적으로 실행된 것과 동일해야 한다.

동작 방식

  1. 트랜잭션 격리 수준: DBMS는 트랜잭션 격리 수준을 통해 트랜잭션 간의 상호 작용을 제어한다. 격리 수준이 높을수록 트랜잭션 간 간섭이 적어지지만, 성능 저하가 발생할 수 있다.

    • READ UNCOMMITTED: 가장 낮은 격리 수준으로, 트랜잭션이 커밋되지 않은 데이터를 읽을 수 있다.

    • READ COMMITTED: 트랜잭션이 커밋된 데이터만 읽을 수 있다.

    • REPEATABLE READ: 트랜잭션이 시작된 이후부터 읽은 데이터는 트랜잭션이 종료될 때까지 변경되지 않는다.

    • SERIALIZABLE: 가장 높은 격리 수준으로, 모든 트랜잭션이 순차적으로 실행된 것처럼 보이게 한다.

트랜잭션 속성 : 지속성 (Durability)

  • 지속성은 트랜잭션이 성공적으로 커밋된 후 그 결과가 영구적으로 데이터베이스에 반영되어, 시스템 오류나 장애가 발생하더라도 해당 결과가 보존된다는 속성이다.
  • 트랜잭션의 결과는 영구적으로 기록되며 손실되지 않는다.

동작 방식

  1. 로그 및 백업: DBMS는 트랜잭션이 커밋될 때 그 내용을 로그 파일에 기록한다. 시스템 장애가 발생하면 로그 파일을 사용해 트랜잭션 결과를 복구한다.

  2. 디스크 쓰기: 트랜잭션이 커밋되면 DBMS는 변경 사항을 디스크에 기록한다. 이는 데이터베이스가 전원을 잃거나 시스템이 충돌해도 트랜잭션 결과가 유지되도록 보장한다.

profile
게임을 좋아하는 사람 입니다!

0개의 댓글