트랜잭션과 격리수준

code4109·2022년 11월 23일
0

JPA

목록 보기
1/2

트랜잭션과 격리수준

ACID

  • 트랜잭션은 ACID라 하는 원자성, 일관성, 격리성, 지속성을 보장해야 한다.
    • 원자성(Atomicity)
      • 트랜잭션 내에서 실행한 작업들은 모두 성공하거나 모두 실패해야 함
    • 일관성(Consistnecy)
      • 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 함
      • 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 함
    • 격리성(Isolation)
      • 동시에 실행되는 트랜잭션들이 동시에 같은 데이터를 수정하는 등, 서로 영향을 미치지 않도록 격리함
      • 격리성은 동시성과 관련한 성능 이슈로 인해 격리 수준을 선택할 수 있음
    • 지속성(Durability)
      • 성공적인 트랜잭션은 그 결과가 항상 기록되어야 함
      • 중간에 시스템에 문제가 발생하더라도 데이터베이스 로그 등을 사용해 성공한 트랜잭션 내용을 복구해야 함
  • 트랜잭션은 원자성, 일관성, 지속성을 보장하지만 문제는 격리성으로, 격리성을 보장하려면 트랜잭션을 거의 차례대로 실행해야 하는데 이렇게 하면 성능에 문제가 생김.
  • 이 문제로 ANSI 표준은 트랜잭션의 격리 수준을 4단계로 나눠 정의함

격리수준의 종류

Read Uncommitted

  • 말 그대로 uncommitted 상태의 데이터를 read, 읽을 수 있는 것
  • 트랜잭션 A에서 update 후 아직 commit 하지 않은 상태의 데이터를 트랜잭션 B에서 읽을 수 있음
  • 이 경우를 Dirty Read라고 하며 만약 트랜잭션 B가 dirty read한 데이터를 사용하는데 트랜잭션 A가 롤백하는 경우 데이터 정합성에 문제가 발생함

Read Committed

  • 커밋한 데이터만 읽을 수 있음
  • Dirty Read는 발생하지 않지만 Non-Repeatable Read가 발생할 수 있음
    • 트랜잭션 A가 조회 중인 데이터를 트랜잭션 B가 업데이트하고 커밋
    • 트랜잭션 A가 다시 해당 데이터를 조회했을 때 수정된 데이터가 조회됨
    • 이렇게 반복해서 같은 데이터를 읽을 수 없는 상태를 Non-Repeatable Read라고 함
  • Dirty Read는 허용하지 않지만 Non-Repeatable Read는 허용하는 격리 수준

Repeatable Read

  • 한 번 조회한 데이터를 다시 조회해도 같은 데이터가 조회됨
  • 이렇게 Non-Repeatable Read가 발생하지 않지만 Phanton Read는 발생할 수 있음
    • 트랜잭션 A가 성이 Mike인 회원을 조회할 때 트랜잭션 B가 성이 Mike인 회원을 추가하고 커밋
    • 트랜잭션 A가 다시 성이 Mike인 회원을 조회하면 회원 하나가 추가된 상태로 조회됨
    • 이렇게 반복 조회 시 결과 집합이 달라지는 것을 Phantom Read라고 함
  • Non-Repeatable Read는 허용하지 않지만 Phantom Read는 허용하는 격리 수준

Serializable

  • Phantom Read까지 발생하지 않는 가장 엄격한 격리 수준
  • 동시성 처리 성능이 급격히 하락할 수 있음

정리

  • 대부분의 애플리케이션은 동시성 처리가 중요하므로 DB는 보통 Read Committed를 격리 수준으로 사용
  • 더 높은 격리 수준이 필요한 경우 DB 트랜잭션이 제공하는 Lock을 사용함

0개의 댓글