📦 트랜잭션(Transaction)
데이터베이스에서 논리적 기능을 수행하기 위한 작업의 단위입니다. DB 접근 방법인 쿼리들을 하나로 묶은 단위이며, 작업의 완전성을 보장합니다. 주요 특징으로 원자성, 일관성, 독립성, 지속성이 있으며, 앞 글자를 따 ACID라 부릅니다.
⚛️ 원자성(Atomicity)
"All or Nothing" 트랜잭션 내의 모든 작업이 완벽하게 수행되었거나, 아예 수행되지 않아야 함을 보장합니다. 중간에 문제가 생기면 롤백하여 아무 일도 없던 것처럼 만듭니다.
- 주의점: 트랜잭션 단위 내 외부 API 호출은 지양해야 합니다. 롤백 시 외부 API 호출 취소가 어렵기 때문입니다.
- 용어 설명:
- 커밋(commit) :
여러 쿼리가 성공적으로 처리되어 변경 내용을 영구 저장하는 것. - 롤백 :
에러나 이슈 발생 시, 트랜잭션 처리 전 상태로 되돌리는 것(취소). - 커밋과 롤백 덕에 데이터의 무결성이 보장됩니다. 또한, 데이터 변경 전에 변경 사항을 쉽게 확인할 수 있고 해당 작업을 그룹화할 수 있습니다.
- 커밋(commit) :
- 용어 설명:
- 트랜잭션 전파 :
여러 트랜잭션 관련 메서드 호출을 하나의 트랜잭션 범위로 묶어 처리하는 것.
- 트랜잭션 전파 :
@Service
@Transactional(readOnly=true)
public class MemberService{
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository){
this.memberRepository=memberRepository;
}
Spring 프레임워크에서는 @Transactional 애너테이션으로 트랜잭션을 간편하게 관리합니다.
⚖️ 일관성(Consistency)
데이터는 미리 정의된 '허용된 방식'으로만 변경되어야 합니다. 데이터베이스의 제약 조건이나 규칙을 위반하는 트랜잭션은 허용되지 않습니다.
- 예시: 잔고가 0원인 계좌에서 500만 원을 이체하는 것은 불가능합니다(음수 잔고 불가).
🔒격리성(Isloation)
동시에 실행되는 트랜잭션들이 서로 영향을 끼치지 않도록 격리하는 것입니다. 마치 순차적으로 실행되는 것처럼 작동해야 합니다. 격리 수준(Level)에 따라 동시성과 격리성의 트레이드오프가 발생합니다.
- 격리 수준: SERIALIZABLE(강함) > REPEATABLE_READ > READ_COMMITTED > READ_UNCOMMITED(약함)
- 격리성이 낮아질수록 동시성(성능)은 높아지지만, 데이터 부정합 문제가 발생할 수 있습니다.
격리 수준에 따라 발생하는 현상:
- 팬텀 리드(phantom read) :
동일 쿼리를 두 번 수행했을 때, 다른 트랜잭션의 삽입(Insert)으로 인해 없던 레코드가 조회되는 현상. - 반복 가능하지 않은 조회(non-repeatable read) :
한 트랜잭션 내에서 같은 행을 두 번 조회했는데, 다른 트랜잭션의 수정(Update)으로 값이 달라지는 현상. - 더티 리드(dirty read) :
다른 트랜잭션이 수정했으나 아직 커밋하지 않은 데이터를 읽는 현상.
격리 수준:
- SERIALIZABLE :
말 그대로 트랜잭션을 순차적으로 진행시키는 것을 말합니다. 여러 트랜잭션이 동시에 같은 행에 접근할 수 없습니다. 이 수준은 매우 엄격한 수준으로 해당 행에 대해 격리시키고, 이후 트랜잭션이 이 행에 대해 일어난다면 기다려야 합니다. 그렇기 때문에 교착 상태가 일어날 확률도 많고 가장 성능이 떨어지는 격리 수준입니다. - REPEATABLE_READ :
하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것은 막지 않습니다. 따라서 이후에 추가된 행이 발견될 수 있습니다. 이는 MySQL8.0의 innoDB 기본값이기도 합니다. - READ_COMMITED :
가장 많이 사용되는 격리 수준이며 PostgreSQL, SQL Server, 오라클에서 기본값으로 설정되어 있습니다. READ UNCOMMITTED와는 달리 다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없습니다. 즉, 커밋 완료된 데이터에 대해서만 조회를 허용합니다. 하지만 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있습니다. 예를 들어 트랜잭션 A가 수정한 행을 트랜잭션 B가 수정할 수도 있습니다. 이 때문에 트랜잭션 A가 같은 행을 다시 읽을 때 다른 내용이 발견될 수 있습니다. - READ_UNCOMMITED :
커밋 전의 데이터도 조회 허용. 가장 빠르지만 데이터 무결성이 보장되지 않음. 대량 데이터의 어림잡는 집계에 사용.
💾 지속성(Durability)
성공적으로 완료(Commit)된 트랜잭션은 시스템 장애가 발생하더라도 영구적으로 반영되어야 합니다. 이를 위해 데이터베이스는 체크섬, 저널링 등을 통해 복구 기능을 제공합니다.
- 용어 설명:
- 체크섬 :
데이터 전송 중 오류가 없는지 확인하기 위한 중복 검사 기술. - 저널링 :
변경 사항을 반영하기 전 로그를 남겨 장애 발생 시 복구할 수 있게 하는 기술.
- 체크섬 :
🛡️ 무결성
데이터의 정확성, 일관성, 유효성을 유지하는 것입니다. 무결성이 지켜져야 DB의 데이터가 현실 세계의 값과 일치한다는 신뢰를 가질 수 있습니다.
| 이름 | 설명 |
| 개체 무결성 | 기본키(PK)로 선택된 필드는 빈 값(NULL)을 허용하지 않음. |
| 참조 무결성 | 외래키(FK) 값은 NULL이거나 참조 테이블의 기본키 값과 동일해야 함. |
| 고유 무결성 | 특정 속성에 대해 고유(Unique) 조건이 있으면 중복 값을 가질 수 없음. |
| NULL 무결셩 | 특정 속성 값에 NULL이 올 수 없다는 조건 시, NULL을 허용하지 않음. |
'Computer Science > Database' 카테고리의 다른 글
| 🔗조인 (0) | 2025.12.03 |
|---|---|
| 🔖 인덱스 (0) | 2025.12.03 |
| 🔍 데이터베이스의 종류 (0) | 2025.12.03 |
| 📐 ERD와 정규화 과정 (0) | 2025.12.02 |
| 🗄️ 데이터베이스의 기본 (0) | 2025.12.02 |