Skip to content

Latest commit

 

History

History
58 lines (43 loc) · 3.9 KB

_1_transaction_and_lock.md

File metadata and controls

58 lines (43 loc) · 3.9 KB

트랜잭션과 락

트랜잭션과 격리 수준

  • 트랜잭션 기초와 JPA가 제공하는 낙관적인 락과 비관적인 락에 대한 정리

트랜잭션의 특성

트랜잭션은 ACID라 하는 원자성, 일관성, 격리성, 지속성을 보장해야 한다.

  • 원자성:
    • 트랜잭션내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공 하든가 모두 실패해야 한다.
  • 일관성:
    • 모든 트랜잭션은 일관성있는 데이터베이스 상태를 유지해야한다.
    • 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
  • 격리성:
    • 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다.
    • 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다.
    • 격리성동시성과 관련된 성능 이슈로 인해 격리 수준을 선택할 수 있다.
  • 지속성:
    • 트랜잭션을 성공적으로 끝내면 그 결과항상 기록되어야 한다.
    • 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.
  • 여기서 중요한 점은 트랜잭션 간격리성을 완벽히 보장하기 위해서는 트랜잭션을 차례로 실행해야 하고, 그렇게 되면 동시성 처리 성능이 나빠진다.
  • 그리하여 트랜잭션의 격리 레벨에 대한 이해동시성에 대한 문제를 해결하는 방법에 대해 알아야 한다.

트랜잭션과 격리 수준

  • READ UNCOMMITED(커밋되지않은 읽기)

    • 커밋하지 않은 데이터를 읽을 수 있다.
    • 트랜잭션 A 가 데이터를 수정하고 있는 와중에 COMMIT을 하지 않아도 트랜잭션 B가 수정 중인 데이터를 볼 수 있다.
    • 이를 DIRTY READ라 하고, 데이터 정합성에 심각한 문제가 발생할 수 있다.
  • READ COMMITTED(커밋된 읽기)

    • 커밋한 데이터만 읽을 수 있다.
    • 커밋한 데이터만 볼 수 있기 때문에 DIRTY READ 현상이 발생하지 않는다.
    • 하지만 NON-REPEATABLE READ는 발생할 수 있다.
    • 트랜잭션 A가 회원 1을 조회 중인데, 그 순간에 트랜잭션 B가 회원 1을 수정하고 COMMIT하는 경우 트랜잭션 A가 다시 회원을 조회 하였을 때 수정된 데이터가 조회된다.
    • 이처럼 반복해서 같은 데이터를 읽을 수 없는 상태를 NON-REPEATABLE READ라 한다.
    • DIRTY-READ는 허용하지만, NON-REPEATABLE READ는 허용하는 격리 수준을 READ COMMITED라 한다.
  • REPEATABLE READ(반복가능한 읽기)

    • 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회된다.
    • 하지만 PHANTOM READ가 발생할 수 있다.
    • 트랜잭션 A가 회원 10 살 이하의 회원을 조회 했는데 트랜잭션 B가 5살 회원을 추가하고 커밋하면, 트랜잭션 A가 다시 10살 이하의 회원을 조회하는 경우 회원 하나가 추가된 상태로 조회된다.
    • 이처럼 반복 조회 시 결과 집합이 달라지는 것을 PHANTOM READ라 한다.
    • NON-REPEATABLE READ는 허용하지 않지만, PHANTOM READ는 허 용하는 격리 수준을 REPEATABLE READ라 한다.
  • SERIALIZABLE(직렬화 가능)

    • 가장 엄격한 트랜잭션 격리 수준이다.
    • PHANTOM READ가 발생하지 않는다. 하지만 동시성 처리 성능이 급격히 떨어질 수 있다.

격리 수준에 대한 고민하기

어플리케이션 대부분은 동시성 처리가 중요하므로 READ COMMITED의 격리 수준을 기본으로 사용한다.

기본은 READ COMMITED로 두고 더 높은 격리 수준이 필요한 경우 데이터베이스 트랜잭션이 제공하는 잠금 기능을 사용하는 방식을 쓴다.