💡 데이터베이스
란?
데이터베이스(DB, Database)는 일정한 규칙, 혹은 규약을 통해 구조화되어 저장되는 데이터의 모음
💡 트랜잭션
이란?
트랜잭션(transaction)은 데이터베이스에 하나의 논리적 기능을 수행하기 위한 작업의 단위로, 여러 개의 쿼리들을 하나로 묶는 단위
💡 원자성 (atomicity)
이란?
트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징 - "all or nothing"
👉 트랜잭션이 커밋했는데, 문제가 발생하여 롤백하는 경우 그 이후에 모두 수행되지 않음을 보장
트랜잭션 단위로 여러 로직들을 묶을 때 외부 API를 호출하는 것이 있으면 안 됨
만약 있다면 롤백시에 해결법과 트랜잭션 전파를 신경써서 관리해야 함
🔗 커밋 (commit)
: 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어
🔗 롤백 (rollback)
: 트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일(취소)
⭐️ 커밋과 롤벡 덕에 데이터의 무결성 보장 가능
🔗 트랜잭션 전파
: 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것
Spring
프레임워크 예시@Service
@Transactional(readOnly = true)
public class MemberService{
private final Member Repository memberRepository;
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
}
💡 일관성 (consistency)
이란?
'허용된 방식'으로만 데이터를 변경해야 하는 것
💡 격리성 (isolation)
이란?
트랜잭션 수행 시 서로 끼어들지 못하는 것
🔗 SERIALIZABLE
: 트랜잭션을 순차적으로 진행
🔗 REPEATABLE_READ
🔗 READ_COMMITTED
: 가장 많이 사용되는 격리 수준
🔗 READ_UNCOMMITTED
: 가장 빠른 격리 수준
🔗 팬텀 리드 (phantom read)
: 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우
🔗 반복 가능하지 않은 조회 (non-repeatable read)
: 한 트랜잭션 내의 같은 행에 두 번 이상 조회 시, 그 값이 다른 경우
🔗 더티 리드 (dirty read)
: 한 트랜잭션 실행 중에 아직 커밋되지 않은 행의 데이터를 읽을 수 있은 경우
💡지속성 (durability)
이란?
성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것을 의미
체크섬
: 중복 검사의 한 형태로, 오류 정정을 통해 무결성 보호
저널링
: 변경 사항을 반영(commit)하기 전에 로깅하는 것, 트랜잭션 등 변경 사항에 대한 로그를 남기는 것
💡무결성
이란?
무결성이란 데이터의 정확성, 일관성, 유효성을 유지하는 것
👉 무결성이 유지되어야 DB의 값과 그 값에 해당하는 현실 세계의 값이 일치한다고 신뢰할 수 있음
🔗 무결성의 종류
이름 | 설명 |
---|---|
개체 무결성 | 기본키로 선택된 필드는 빈 값을 허용하지 않음 |
참조 무결성 | 서로 참조 관계의 두 테이블의 데이터는 항상 일관된 값 유지 |
고유 무결성 | 고유한 값을 가지는 조건의 속성의 경우 그 속성 값은 모두 고유한 값을 가짐 |
NULL 무결성 | NULL이 올 수 없다는 조건의 속성의 경우 그 속성 값은 모두 NULL이 아님 |