트랜잭션

지니·2021년 1월 30일
0

SQLP

목록 보기
6/16

트랜잭션(Transaction) : 업무 처리를 위한 논리적인 작업 단위

트랜잭션의 특징

  • 원자성 (Atomicity) : 트랜잭션은 더이상 분해가 불가능한 업무의 최소단위이므로, 전부 처리되거나 아예 하나도 처리되지 않아야 한다.
  • 일관성 (Consistency) : 하나의 트랜잭션을 성공적으로 완료하고 나면 데이터베이스의 상태가 모순되지 않아야 한다.
  • 고립성 (Isolation) : 실행 중인 트랜잭션의 중간결과를 다른 트랜잭션이 접근할 수 없다.
  • 영속성 (Durablity) : 트랜잭션이 일단 그 실행을 성공적으로 완료하면 그 결과는 데이터베이스에 영속적으로 저장되어야 한다.

트랜잭션의 격리성

트랜잭션의 격리성은 Lock을 강하게 오래 유지할수록 강화되고, Lock을 최소화할수록 약화된다.

낮은 단계의 격리성 수준에서 발생할 수 있는 현상들

  • Dirty Read : 다른 트랜잭션에 의해 수정됐지만 아직 커밋되지 않은 데이터를 읽는 것
  • Non-Repeatable Read : 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에 두 쿼리 결과가 다르게 나타나는 것.
  • Phantom Read : 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫 번째 쿼리에서 없던 유령(Phantom) 레코드가 두 번째 쿼리에서 나타나는

트랜잭션 격리성 수준

  • Read Uncommitted
    : 트랜잭션에서 처리 중인 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
    -> Dirty Read, Non-Repeatable Read, Phantom Read 가능
  • Read Committed
    : 트랜잭션이 커밋되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용해준다.
    -> Non-Repeatable Read, Phantom Read 가능
  • Repeatable Read
    : 트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지해준다.
    -> Phantom Read 가능
  • Serializble Read
    : 트랜잭션 내에서 쿼리를 두 번 이상 수행했을 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지도 않는다.
    -> 전부 불가능

다중 트랜잭션 환경에서 DBMS가 제공하는 기능을 이용해 동시성을 제어하려면 트랜잭션 시작 전에 명시적으로 Set Transaction 명령어를 수행하면 된다.

대부분 DBMS가 Read Committed를 기본 트랜잭션 격리성 수준으로 채택하고 있으므로 Dirty Read가 발생할까 걱정하지 않아도 되지만, Non-Repeatable Read, Phantom Read 현상에 대해서는 세심한 주의가 필요하다. 또한, 트랜잭션 격리성 수준을 상향 조정할수록 일관성은 높아지지만 동시성은 낮아진다는 점도 유념해야 한다.

profile
duckling

0개의 댓글