트랜잭션(Transaction)과 ACID 속성에 대한 이해

이성혁·2024년 8월 31일

Database

목록 보기
13/24
post-thumbnail

1. 트랜잭션(Transaction)이란?

트랜잭션은 데이터베이스에서 단일 논리적 작업 단위를 의미합니다. 예를 들어, 한 사용자가 다른 사용자에게 돈을 이체하는 상황을 생각해 봅시다. 이 작업을 SQL로 표현하면 다음과 같습니다:

UPDATE account SET balance = balance - 200000 WHERE user_id = 'J';
UPDATE account SET balance = balance + 200000 WHERE user_id = 'H';

이 두 SQL 문은 모두 성공해야 이체가 완료됩니다. 만약 하나의 작업만 성공하고 다른 하나가 실패한다면 데이터의 무결성이 깨집니다. 따라서 이러한 작업들은 모두 성공하거나 모두 실패해야 합니다. 트랜잭션은 여러 SQL 문을 하나의 작업 단위로 묶어 처리하여, 모든 작업이 성공했을 때만 데이터베이스에 반영되도록 보장합니다.


2. 트랜잭션의 구현

MySQL에서 트랜잭션을 사용하는 방법은 다음과 같습니다:

  1. 트랜잭션 시작: START TRANSACTION;
  2. SQL 문 실행:
    • UPDATE account SET balance = balance - 200000 WHERE user_id = 'J';
    • UPDATE account SET balance = balance + 200000 WHERE user_id = 'H';
  3. 트랜잭션 커밋(저장): COMMIT;

만약 중간에 문제가 발생하면 ROLLBACK;을 사용하여 트랜잭션을 취소하고 이전 상태로 되돌릴 수 있습니다.


3. 트랜잭션의 주요 속성: ACID

트랜잭션이 가지는 ACID 속성은 다음과 같습니다:

  1. Atomicity(원자성):
    • 트랜잭션 내의 모든 작업이 모두 성공하거나 모두 실패해야 합니다. 일부만 성공하고 일부는 실패하는 상황이 발생하지 않도록 보장합니다.
  2. Consistency(일관성):
    • 트랜잭션이 완료된 후 데이터베이스는 항상 일관된 상태를 유지해야 합니다. 트랜잭션이 일관성을 깨뜨리면 데이터베이스는 해당 트랜잭션을 롤백하여 이전 상태로 되돌립니다.
  3. Isolation(고립성):
    • 여러 트랜잭션이 동시에 실행될 때 서로의 작업에 영향을 주지 않도록 고립되어야 합니다. 각 트랜잭션이 독립적으로 실행된 것처럼 처리됩니다.
  4. Durability(지속성):
    • 커밋된 트랜잭션의 결과는 영구적으로 데이터베이스에 반영됩니다. 시스템 장애가 발생하더라도 커밋된 데이터는 손실되지 않습니다.

4. 트랜잭션의 실제 사용 예

Java에서 트랜잭션을 사용하는 방법:

try {
    connection.setAutoCommit(false); // 오토커밋 비활성화
    // 트랜잭션 작업 수행
    // 예: 계좌 이체 로직
    connection.commit(); // 성공 시 커밋
} catch (SQLException e) {
    connection.rollback(); // 실패 시 롤백
} finally {
    connection.setAutoCommit(true); // 오토커밋 다시 활성화
}

Spring에서 트랜잭션 사용하는 방법:

@Transactional
public void transferMoney(String fromAccount, String toAccount, BigDecimal amount) {
    accountService.withdraw(fromAccount, amount);
    accountService.deposit(toAccount, amount);
}

이 예시에서 @Transactional 어노테이션은 메서드 전체를 하나의 트랜잭션으로 처리합니다. 모든 작업이 성공적으로 완료되면 자동으로 커밋되고, 예외가 발생하면 롤백됩니다.


5. 트랜잭션 관리와 ACID 속성의 중요성

트랜잭션을 정의하고 관리하는 것은 개발자가 신중하게 접근해야 할 중요한 과제입니다. 이는 데이터베이스의 안정성과 신뢰성을 보장하는 핵심 요소이기 때문입니다. 특히 ACID 속성을 깊이 이해하고, 이를 철저히 준수하기 위해 트랜잭션의 범위와 로직을 정교하게 설계하는 것이 필수적입니다. 이는 단순히 기술적인 문제가 아니라, 비즈니스 로직의 정확성과 데이터의 일관성을 보장하는 중요한 과정입니다.

ACID 속성을 적절히 구현하지 않으면, 데이터베이스의 무결성이 심각하게 훼손될 수 있으며, 이는 시스템 전반의 신뢰성에 치명적인 영향을 미칠 수 있습니다. 또한, 잘못 설계된 트랜잭션은 데이터베이스의 성능을 현저히 저하시킬 수 있어, 시스템의 전반적인 효율성에도 악영향을 끼칩니다. 따라서 개발자는 트랜잭션 설계 시 데이터의 정확성, 일관성, 그리고 시스템의 성능을 균형 있게 고려해야 합니다.


출처

https://www.youtube.com/watch?v=aL0XXc1yGPs&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe

profile
항상 배우는 자세로 🪴

0개의 댓글