개발기록

데이터베이스 언두 로그(Undo Log) & Transaction(readOnly=true) 본문

Spring

데이터베이스 언두 로그(Undo Log) & Transaction(readOnly=true)

Danuvibe 2024. 9. 9. 22:44

언두 로그(Undo Log)는 데이터베이스 관리 시스템(DBMS)에서 트랜잭션의 원자성(Atomicity)과 일관성(Consistency)을 보장하기 위해 사용되는 중요한 메커니즘입니다. 이 로그는 데이터 변경 이전의 상태를 기록하여, 필요한 경우 데이터를 이전 상태로 되돌릴 수 있게 합니다.

1. 언두 로그의 주요 기능

  1. 트랜잭션 롤백: 트랜잭션 실패 시 데이터를 원래 상태로 복원합니다.
  2. 일관성 있는 읽기: 동시에 실행되는 다른 트랜잭션에 영향을 주지 않고 일관된 데이터 읽기를 제공합니다.
  3. 충돌 해결: 동시성 제어 시 발생할 수 있는 데이터 충돌을 해결합니다.

2. 언두 로그의 작동 방식

  1. 데이터 변경 전 기록:
    -- 예: 사용자 잔액 업데이트
    UPDATE users SET balance = balance - 100 WHERE id = 1;
    -- 언두 로그에 기록: id=1인 사용자의 원래 잔액

    •  
  2. 롤백 시 사용:
    • 트랜잭션 실패 시, 언두 로그를 사용하여 변경사항을 취소합니다.
  3. 동시성 제어:
    • 다른 트랜잭션이 동일한 데이터를 읽을 때, 언두 로그를 참조하여 일관된 버전의 데이터를 제공합니다.

3. 언두 로그와 성능

  • 공간 사용: 언두 로그는 추가적인 저장 공간을 사용합니다.
  • I/O 작업: 로그 기록을 위한 추가적인 I/O 작업이 발생합니다.
  • 관리 오버헤드: 주기적으로 불필요한 언두 로그를 정리해야 합니다.

4. readonly = true와 언두 로그

@Transactional(readonly = true) 설정은 언두 로그 사용을 최소화합니다:

  1. 로그 생성 방지: 읽기 전용 트랜잭션은 데이터를 변경하지 않으므로, 새로운 언두 로그 엔트리를 생성하지 않습니다.
  2. 리소스 절약: 언두 로그 생성과 관리에 필요한 리소스를 절약할 수 있습니다.
  3. 성능 향상: 언두 로그 관련 작업이 줄어들어 전반적인 데이터베이스 성능이 향상됩니다.

5. 실제 예시

@Transactional // 기본 트랜잭션
public void updateUser(User user) {
    // 언두 로그 생성됨
    user.setName("New Name");
    userRepository.save(user);
}

@Transactional(readOnly = true) // 읽기 전용 트랜잭션
public User getUser(Long id) {
    // 언두 로그 생성 안 됨
    return userRepository.findById(id).orElseThrow();
}

결론

언두 로그는 데이터베이스의 안정성과 일관성을 유지하는 데 필수적인 요소지만, 동시에 성능에 영향을 줄 수 있습니다. readonly = true 설정은 불필요한 언두 로그 생성을 방지하여 데이터베이스 성능을 최적화하는 효과적인 방법입니다.

Comments