ACID: 두 판 사이의 차이

기술노트
(Gemini 벌크 업로더로 자동 업로드)
(Gemini 벌크 업로더로 자동 업로드)
 
(같은 사용자의 중간 판 하나는 보이지 않습니다)
1번째 줄: 1번째 줄:
== 🔥 ACID ==
<div style="font-family: 'Malgun Gothic';">
= ACID =
[[기술면접 CS 지식|← 목록으로 돌아가기]]


'''ACID'''는 데이터베이스 '''트랜잭션(Transaction)'''이 안전하게 수행되기 위해 반드시 만족해야 하는 네 가지 핵심적인 성질을 의미합니다. 이 원칙을 통해 데이터베이스 시스템은 여러 트랜잭션이 동시에 실행되는 환경에서도 데이터의 무결성과 신뢰성을 보장할 수 있습니다.
'''ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(Transaction)의 안전성을 보장하기 위해 필요한 4가지 성질(원자성, 일관성, 고립성, 지속성)을 의미합니다.'''


----
데이터베이스 트랜잭션이 가져야 할 이 4가지 특성은 데이터의 무결성을 지키고, 시스템 오류 상황에서도 데이터의 신뢰도를 유지하는 데 핵심적인 역할을 합니다. 특히 여러 사용자가 동시에 데이터에 접근하는 금융 시스템, 예약 시스템 등에서 ACID 원칙은 반드시 지켜져야 합니다.
 
=== ⚛️ A: 원자성 (Atomicity) ===
 
트랜잭션에 포함된 모든 작업이 '''모두 성공하거나, 하나라도 실패하면 모두 실패'''하는 것을 보장하는 성질입니다. 즉, 작업이 부분적으로만 실행되는 경우는 절대 없습니다. (All or Nothing)
 
* '''예시''' : 계좌 이체 시, 출금 작업만 성공하고 입금 작업이 실패하는 경우는 없어야 합니다. 출금이 성공하면 반드시 입금도 성공해야 하고, 입금이 실패하면 출금 작업도 취소(롤백)되어야 합니다.


----
----


=== 🌐 C: 일관성 (Consistency) ===
== ACID의 4가지 성질 ==
 
가장 흔히 사용되는 예시인 **'A 계좌에서 B 계좌로 1만 원을 송금'** 하는 상황을 통해 ACID의 각 성질을 이해해 보겠습니다.
트랜잭션이 성공적으로 완료된 후에도, 데이터베이스가 항상 '''일관된 상태'''를 유지해야 함을 의미합니다. 데이터베이스에 정의된 모든 규칙(제약 조건, 트리거 등)은 트랜잭션 전후에도 위반되지 않아야 합니다.
 
* '''예시''' : 계좌 이체 후에도, 시스템 전체의 총 잔액은 이체 전과 동일하게 유지되어야 합니다.


----
; 1. 원자성 (Atomicity)
: '''하나의 트랜잭션에 포함된 모든 작업이 전부 성공하거나, 또는 전부 실패하여 결과를 되돌리는(Rollback) 것을 보장합니다. (All or Nothing)'''


=== 🚧 I: 고립성 (Isolation) ===
*  **예시:** A 계좌에서 1만 원을 인출하는 작업과 B 계좌에 1만 원을 입금하는 작업은 하나의 트랜잭션으로 묶입니다. 만약 인출에는 성공했지만, 시스템 장애로 입금에 실패했다면, 인출했던 1만 원을 다시 A 계좌로 되돌려 트랜잭션 시작 전의 상태로 완벽하게 복구해야 합니다. 돈이 중간에 사라지는 일은 절대 발생하지 않습니다.


하나의 트랜잭션이 실행되는 동안에는, 다른 트랜잭션이 중간 결과를 볼 수 없도록 '''격리'''하는 것을 의미합니다. 각 트랜잭션은 마치 데이터베이스에 혼자 접근하는 것처럼 보여야 합니다.
; 2. 일관성 (Consistency)
: '''트랜잭션이 성공적으로 완료된 후에도 데이터베이스가 항상 일관된 상태를 유지해야 함을 의미합니다.'''


* '''예시''' : A가 B에게 송금하는 트랜잭션이 아직 완료되지 않았다면, 다른 트랜잭션은 A의 잔액이 줄어들었거나 B의 잔액이 늘어난 중간 상태를 봐서는 안 됩니다.
*   **예시:** A와 B의 계좌 잔액 합이 10만 원이었다면, 송금 트랜잭션이 완료된 후에도 그 합은 여전히 10만 원이어야 합니다. 트랜잭션의 실행이 데이터베이스의 규칙(무결성 제약조건, 예: 잔액은 음수가 될 수 없다)을 깨뜨리지 않음을 보장합니다.


----
; 3. 고립성 (Isolation)
: '''여러 트랜잭션이 동시에 실행될 때, 각 트랜잭션은 서로에게 영향을 주지 않고 독립적으로 실행되는 것처럼 보여야 합니다.'''


=== 💾 D: 지속성 (Durability) ===
*  **예시:** A가 B에게 송금하는 트랜잭션이 아직 완료되지 않은 중간 상태에서, 다른 사용자가 두 계좌의 잔액을 조회한다고 가정해 봅시다. 이때, 고립성이 보장된다면 다른 사용자는 송금이 완전히 끝나기 전의 잔액 또는 완전히 끝난 후의 잔액만 볼 수 있습니다. A의 돈은 빠져나갔지만 B에게는 아직 입금되지 않은 어중간한 상태의 데이터를 읽을 수 없습니다.


성공적으로 완료된 트랜잭션의 결과는 시스템에 장애가 발생하더라도 '''영구적으로 저장'''되어야 함을 의미합니다. 데이터베이스는 로그(Log) 등을 사용하여, 시스템 다운이나 정전이 발생해도 완료된 트랜잭션의 결과를 복구할 수 있어야 합니다.
; 4. 지속성 (Durability)
: '''성공적으로 완료된 트랜잭션의 결과는 시스템에 장애가 발생하더라도 영구적으로 저장되어야 함을 의미합니다.'''


* '''예시''' : 계좌 이체가 성공적으로 완료되었다는 메시지를 받았다면, 그 직후에 은행 시스템에 장애가 발생하더라도 이체 결과는 사라지지 않아야 합니다.
*   **예시:** 송금이 성공적으로 완료되었다는 메시지를 받았다면, 그 직후에 데이터베이스 서버에 전원 공급이 끊기는 등의 문제가 발생해도 송금 결과는 디스크 등에 영구적으로 기록되어 사라지지 않아야 합니다. 시스템이 재시작되었을 때, 송금 내역은 그대로 남아있어야 합니다.


----
----


=== 💡 정보처리기사 핵심 Point ===
'''결론적으로 ACID는 "작업이 분리될 수 없고(원자성), 실행 후에도 데이터 상태에 문제가 없으며(일관성), 다른 작업에 방해받지 않고(고립성), 그 결과가 영원히 보장되는(지속성)" 성질을 통해 데이터베이스 트랜잭션의 신뢰성을 보장하는 핵심 원칙입니다.'''


* ACID는 '''관계형 데이터베이스(RDBMS)'''가 데이터의 신뢰성을 보장하는 핵심 원리입니다.
</div>
* 반면, 많은 '''NoSQL''' 데이터베이스는 성능과 확장성을 위해 ACID 원칙을 완화한 'BASE'(Basically Available, Soft state, Eventually consistent) 모델을 따르기도 합니다.
* 서비스의 성격에 따라 데이터의 일관성이 얼마나 중요한지를 파악하고, 그에 맞는 데이터베이스 기술을 선택하는 것이 중요합니다.

2025년 9월 11일 (목) 17:01 기준 최신판

ACID

← 목록으로 돌아가기

ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(Transaction)의 안전성을 보장하기 위해 필요한 4가지 성질(원자성, 일관성, 고립성, 지속성)을 의미합니다.

데이터베이스 트랜잭션이 가져야 할 이 4가지 특성은 데이터의 무결성을 지키고, 시스템 오류 상황에서도 데이터의 신뢰도를 유지하는 데 핵심적인 역할을 합니다. 특히 여러 사용자가 동시에 데이터에 접근하는 금융 시스템, 예약 시스템 등에서 ACID 원칙은 반드시 지켜져야 합니다.


ACID의 4가지 성질

가장 흔히 사용되는 예시인 **'A 계좌에서 B 계좌로 1만 원을 송금'** 하는 상황을 통해 ACID의 각 성질을 이해해 보겠습니다.

1. 원자성 (Atomicity)
하나의 트랜잭션에 포함된 모든 작업이 전부 성공하거나, 또는 전부 실패하여 결과를 되돌리는(Rollback) 것을 보장합니다. (All or Nothing)
  • **예시:** A 계좌에서 1만 원을 인출하는 작업과 B 계좌에 1만 원을 입금하는 작업은 하나의 트랜잭션으로 묶입니다. 만약 인출에는 성공했지만, 시스템 장애로 입금에 실패했다면, 인출했던 1만 원을 다시 A 계좌로 되돌려 트랜잭션 시작 전의 상태로 완벽하게 복구해야 합니다. 돈이 중간에 사라지는 일은 절대 발생하지 않습니다.
2. 일관성 (Consistency)
트랜잭션이 성공적으로 완료된 후에도 데이터베이스가 항상 일관된 상태를 유지해야 함을 의미합니다.
  • **예시:** A와 B의 계좌 잔액 합이 10만 원이었다면, 송금 트랜잭션이 완료된 후에도 그 합은 여전히 10만 원이어야 합니다. 트랜잭션의 실행이 데이터베이스의 규칙(무결성 제약조건, 예: 잔액은 음수가 될 수 없다)을 깨뜨리지 않음을 보장합니다.
3. 고립성 (Isolation)
여러 트랜잭션이 동시에 실행될 때, 각 트랜잭션은 서로에게 영향을 주지 않고 독립적으로 실행되는 것처럼 보여야 합니다.
  • **예시:** A가 B에게 송금하는 트랜잭션이 아직 완료되지 않은 중간 상태에서, 다른 사용자가 두 계좌의 잔액을 조회한다고 가정해 봅시다. 이때, 고립성이 보장된다면 다른 사용자는 송금이 완전히 끝나기 전의 잔액 또는 완전히 끝난 후의 잔액만 볼 수 있습니다. A의 돈은 빠져나갔지만 B에게는 아직 입금되지 않은 어중간한 상태의 데이터를 읽을 수 없습니다.
4. 지속성 (Durability)
성공적으로 완료된 트랜잭션의 결과는 시스템에 장애가 발생하더라도 영구적으로 저장되어야 함을 의미합니다.
  • **예시:** 송금이 성공적으로 완료되었다는 메시지를 받았다면, 그 직후에 데이터베이스 서버에 전원 공급이 끊기는 등의 문제가 발생해도 송금 결과는 디스크 등에 영구적으로 기록되어 사라지지 않아야 합니다. 시스템이 재시작되었을 때, 송금 내역은 그대로 남아있어야 합니다.

결론적으로 ACID는 "작업이 분리될 수 없고(원자성), 실행 후에도 데이터 상태에 문제가 없으며(일관성), 다른 작업에 방해받지 않고(고립성), 그 결과가 영원히 보장되는(지속성)" 성질을 통해 데이터베이스 트랜잭션의 신뢰성을 보장하는 핵심 원칙입니다.