Notice
코딩항해기
[DBMS] ACID 본문
ACID
데이터베이스에서 ACID는 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 나타내는 약어다. 각각 Atomicity(원자성), Consistency(일관성), Isolation(격리성), Durability(지속성)를 의미한다. 이 네 가지 특성은 데이터베이스의 무결성을 보장하는 핵심 요소이다.
Atomicity (원자성)
원자성은 트랜잭션의 작업이 모두 성공하거나 모두 실패해야 함을 의미한다. 예시는 계좌 이체 상황이다.
try {
// 트랜잭션 시작
connection.setAutoCommit(false);
// A계좌에서 돈을 출금
String debitQuery = "UPDATE accounts SET balance = balance - ? WHERE account_id = ?";
PreparedStatement debitStmt = connection.prepareStatement(debitQuery);
debitStmt.setDouble(1, amount);
debitStmt.setString(2, fromAccount);
debitStmt.executeUpdate();
// B계좌로 돈을 입금
String creditQuery = "UPDATE accounts SET balance = balance + ? WHERE account_id = ?";
PreparedStatement creditStmt = connection.prepareStatement(creditQuery);
creditStmt.setDouble(1, amount);
creditStmt.setString(2, toAccount);
creditStmt.executeUpdate();
// 모든 작업이 성공하면 커밋
connection.commit();
} catch (SQLException e) {
// 문제 발생 시 롤백
connection.rollback();
}
Consistency (일관성)
일관성은 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지되어야 함을 의미한다. 예를 들어, 계좌 잔액은 항상 0원 이상이어야 한다는 규칙이 있다면 이를 위반하는 트랜잭션은 수행될 수 없다.
public void transfer(String fromAccount, String toAccount, double amount) {
// 현재 잔액 확인
double currentBalance = getCurrentBalance(fromAccount);
if (currentBalance >= amount) {
// 이체 진행
executeTransfer(fromAccount, toAccount, amount);
} else {
// 잔액 부족으로 이체 거부
throw new InsufficientBalanceException("잔액이 부족합니다.");
}
}
Isolation (격리성)
격리성은 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리하는 성질이다. 데이터베이스는 여러 격리 수준을 제공한다.
// 격리 수준 설정 예시
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
// 동시 실행되는 두 트랜잭션
public void transaction1() {
try {
connection.setAutoCommit(false);
// 데이터 수정
connection.commit();
} catch (Exception e) {
connection.rollback();
}
}
public void transaction2() {
try {
connection.setAutoCommit(false);
// 다른 데이터 수정
connection.commit();
} catch (Exception e) {
connection.rollback();
}
}
Durability (지속성)
지속성은 성공적으로 완료된 트랜잭션의 결과가 영구적으로 반영되어야 함을 의미한다. 시스템 장애가 발생하더라도 완료된 트랜잭션의 내용은 보존되어야 한다.
// 트랜잭션 로그를 통한 지속성 보장 예시
public void logTransaction(String transactionId, String operation) {
String logQuery = "INSERT INTO transaction_log (transaction_id, operation, timestamp) VALUES (?, ?, ?)";
try (PreparedStatement stmt = connection.prepareStatement(logQuery)) {
stmt.setString(1, transactionId);
stmt.setString(2, operation);
stmt.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
stmt.executeUpdate();
}
}
데이터베이스의 ACID 특성이 중요한 이유
비즈니스 로직에서 데이터의 정확성과 신뢰성은 매우 중요하다. 은행 거래, 재고 관리, 예약 시스템 등에서 데이터 처리의 안정성을 보장하기 위해 ACID 특성이 필수적이다. 이러한 특성들이 제대로 지켜지지 않으면 데이터 불일치, 손실 등 심각한 문제가 발생할 수 있다.
'DBMS' 카테고리의 다른 글
[DBMS] N+1 문제 (0) | 2024.12.20 |
---|---|
[DBMS] Eager Loading & Lazy Loading (0) | 2024.12.18 |
[DBMS] ORM (Object-Relational Mapping) (0) | 2024.12.17 |
[DBMS] PostgreSQL 이해 (ORDBMS) (0) | 2024.11.23 |
[DBMS] MongoDB 이해 (NoSQL) (0) | 2024.11.22 |