개발기록
데이터베이스 언두 로그(Undo Log) & Transaction(readOnly=true) 본문
언두 로그(Undo Log)는 데이터베이스 관리 시스템(DBMS)에서 트랜잭션의 원자성(Atomicity)과 일관성(Consistency)을 보장하기 위해 사용되는 중요한 메커니즘입니다. 이 로그는 데이터 변경 이전의 상태를 기록하여, 필요한 경우 데이터를 이전 상태로 되돌릴 수 있게 합니다.
1. 언두 로그의 주요 기능
- 트랜잭션 롤백: 트랜잭션 실패 시 데이터를 원래 상태로 복원합니다.
- 일관성 있는 읽기: 동시에 실행되는 다른 트랜잭션에 영향을 주지 않고 일관된 데이터 읽기를 제공합니다.
- 충돌 해결: 동시성 제어 시 발생할 수 있는 데이터 충돌을 해결합니다.
2. 언두 로그의 작동 방식
- 데이터 변경 전 기록:
-- 예: 사용자 잔액 업데이트 UPDATE users SET balance = balance - 100 WHERE id = 1; -- 언두 로그에 기록: id=1인 사용자의 원래 잔액
- 롤백 시 사용:
- 트랜잭션 실패 시, 언두 로그를 사용하여 변경사항을 취소합니다.
- 동시성 제어:
- 다른 트랜잭션이 동일한 데이터를 읽을 때, 언두 로그를 참조하여 일관된 버전의 데이터를 제공합니다.
3. 언두 로그와 성능
- 공간 사용: 언두 로그는 추가적인 저장 공간을 사용합니다.
- I/O 작업: 로그 기록을 위한 추가적인 I/O 작업이 발생합니다.
- 관리 오버헤드: 주기적으로 불필요한 언두 로그를 정리해야 합니다.
4. readonly = true와 언두 로그
@Transactional(readonly = true) 설정은 언두 로그 사용을 최소화합니다:
- 로그 생성 방지: 읽기 전용 트랜잭션은 데이터를 변경하지 않으므로, 새로운 언두 로그 엔트리를 생성하지 않습니다.
- 리소스 절약: 언두 로그 생성과 관리에 필요한 리소스를 절약할 수 있습니다.
- 성능 향상: 언두 로그 관련 작업이 줄어들어 전반적인 데이터베이스 성능이 향상됩니다.
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 설정은 불필요한 언두 로그 생성을 방지하여 데이터베이스 성능을 최적화하는 효과적인 방법입니다.
'Spring' 카테고리의 다른 글
| JPQL 벌크 연산을 통한 더티 체킹 우회 (0) | 2024.09.09 |
|---|---|
| JPA 더티 체킹의 성능 이슈와 최적화 전략 (0) | 2024.09.09 |
| Spring 트랜잭션의 readonly=true 설정: 숨겨진 성능의 비밀 (0) | 2024.09.09 |
| Spring Batch의 청크 기반 처리: Kotlin으로 구현하기 (1) | 2024.09.09 |
| Spring AOP를 이용한 횡단 관심사 처리: Kotlin 예제로 알아보기 (0) | 2024.09.01 |
Comments