We will find a way, we always have.

-interstellar

Computer Science/데이터 베이스

[DB] 트랜잭션

Redddy 2023. 9. 7. 20:53

트랜잭션 이해


트랜잭션 - 개념 이해

트랜잭션은 데이터베이스의 작업 단위이다.


ACID

트랜잭션이 안전하게 수행된다는 것을 보장하기 위해서는 ACID가 만족해야 한다.

  • Atomicity(원자성): 설정된 트랜잭션 범위 안의 내용들이 마치 하나의 작업처럼 모두 성공하거나 모두 실패해야 한다.
  • Consistency(일관성): 모든 트랜잭션은 일관성 있는 DB 상태를 유지해야 한다. 트랜잭션은 DB에서 정한 무결성 제약 조건을 항상 만족해야 한다.
  • Isolation(독립성): 여러 트랜잭션이 있을 때, 각각의 트랜잭션은 다른 트랜잭션의 연산에 끼어들지 못하고 독립적이다.
  • Durability(영구성): 트랜잭션이 성공했다면 그 결과가 항상 기록되어야 한다. 문제가 발생하여도 DB 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야한다.

트랜잭션의 격리 수준에 따른 현상

  • Phantom reads(팬텀 리드): 한 트랜잭션 내에서 동일한 쿼리를 2번 이상 보냈을 때 해당 조회 결과가 서로 다른 현상
  • Nonrepeatable reads(반복 가능하지 않은 조회): 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데 해당 결과가 서로 다른 현상
  • Dirty reads(더티 리드): 하나의 트랜잭션이 다른 트랜잭션의 아직 커밋되지 않은 데이터를 읽는 현상, T1이 업데이트 이후 롤백을 하여 커밋되지 않은
    데이터가 됐음에도 불구하고 T2는 이미 커밋되었다고 판단

트랜잭션 격리 수준 - Isolation level

  • READ-UNCOMMITTED(커밋되지 않은 읽기)
    • 커밋이 끝나지 않은 데이터를 다른 트랜잭션이 읽을 수 있다.
    • `예를 들어 A,B 순서로 진행중인 트랜잭션이 있다.
    • 트랜잭션 A가 커밋하지 않은 데이터에 트랜잭션 B가 접근해 데이터 값을 읽을 수 있다.
    • 이 경우에 진행중인 트랜잭션 A는 롤백될수도 있기에 데이터 값은 달라질 수 있다.
    • 팬텀리드, 반복 가능하지 않은 조회, 더티리드가 일어날 수도 있다.
  • READ-COMMITTED(커밋된 읽기)
    • 커밋이 끝난 데이터만 다른 트랜잭션이 읽을 수 있고, 커밋을 하지 않은 데이터에는 접근이 불가하다.
    • 예를 들어 A,B 순서로 진행중인 트랜잭션이 있다. 트랜잭션 A가 아직 커밋하지 않았다면, 트랜잭션 B는 트랜잭션 A가 시작되기 전 데이터를 읽어온다.
    • 그리고 A가 커밋이 끝나면 다시 같은 데이터의 값을 읽어온다.
    • 이렇기에 트랜잭션 시작 전, 후 데이터 값이 다를 수 있어 팬텀리드, 반복 가능하지 않은 조회가 일어날 수도 있다.
  • REPEATABLE-READ(반복 가능한 읽기)
    • 하나의 트랜잭션 내에서 동일 select 쿼리를 실행했을 때, 항상 같은 결과를 가져와야 한다.
    • 이 경우는 데이터가 변경되더라도 같은 데이터를 읽게 해주는 것이다.
    • 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 락을 걸지만 새로운 행을 추가하는 것은 막지 않는다.
    • 팬텀리드가 일어날 수도 있다.
  • SERIALIZABLE(직렬화 기능)
    • 하나의 트랜잭션에서 작업 중인 데이터는 다른 트랜잭션에서 접근할 수 없다. 즉 여러 트랜잭션이 동시에 같은 행에 접근할 수 없다.
      철저한 독립성을 보장하며 동시성을 허용하지 않는다.