🔐 트랜잭션과 무결성

2025. 12. 3. 13:57·Computer Science/Database

📦 트랜잭션(Transaction)

데이터베이스에서 논리적 기능을 수행하기 위한 작업의 단위입니다. DB 접근 방법인 쿼리들을 하나로 묶은 단위이며, 작업의 완전성을 보장합니다. 주요 특징으로 원자성, 일관성, 독립성, 지속성이 있으며, 앞 글자를 따 ACID라 부릅니다.

⚛️ 원자성(Atomicity)

"All or Nothing" 트랜잭션 내의 모든 작업이 완벽하게 수행되었거나, 아예 수행되지 않아야 함을 보장합니다. 중간에 문제가 생기면 롤백하여 아무 일도 없던 것처럼 만듭니다.

  • 주의점: 트랜잭션 단위 내 외부 API 호출은 지양해야 합니다. 롤백 시 외부 API 호출 취소가 어렵기 때문입니다.
  • 용어 설명: 
    • 커밋(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
'Computer Science/Database' 카테고리의 다른 글
  • 🔖 인덱스
  • 🔍 데이터베이스의 종류
  • 📐 ERD와 정규화 과정
  • 🗄️ 데이터베이스의 기본
TECHNING
TECHNING
Hi! I'm techning
  • TECHNING
    TECHNING
    TECHNING
    • 분류 전체보기 (54)
      • Computer Science (45)
        • Design Pattern (11)
        • Programming Paradigm (4)
        • Network (15)
        • Operating System (6)
        • Database (6)
        • Data Structure (3)
      • Algorithm (5)
        • Python (3)
        • Java (1)
      • IT Insight (4)
  • hELLO· Designed By정상우.v4.10.4
TECHNING
🔐 트랜잭션과 무결성
상단으로

티스토리툴바