Theory
Database
트랜잭션

트랜잭션

데이터베이스 관리 시스템 또는 유사한 시스템에서 상호 연관된 작업들을 묶어서 하나의 작업으로 처리하는 것을 말한다.
트랜잭션은 속칭 ACID라고 불리는 특징들을 보장해야 한다.

  • 원자성(Atomicity) : 트랜잭션은 성공 또는 실패로 끝나야 한다. 즉, 트랜잭션 내의 모든 작업이 성공하면 성공하고, 하나라도 실패하면 실패해야 한다.
  • 일관성(Consistency) : 트랜잭션이 실행을 성공적으로 완료하면 일관성 있는 상태로 유지되어야 한다.
    • 데이터베이스에서 정한 무결성 제약 조건을 만족해야 한다.
일관성 제약 조건이 잘 지켜지는 예시

예를 들어 은행 계좌 시스템에서의 일관성을 생각해볼 수 있습니다. 계좌 이체 트랜잭션을 실행할 때, 일관성 조건에 따라 다음과 같은 요구사항이 충족되어야 합니다:

  1. 잔액 검증: 이체를 하기 전에 이체하는 계좌에 충분한 잔액이 있는지 확인해야 합니다. 잔액이 부족한 경우, 트랜잭션은 실패해야 합니다.
  2. 원자성 보장: 이체 트랜잭션은 원자성을 가져야 하며, 이는 이체 과정이 전부 아니면 전혀 이루어지지 않아야 함을 의미합니다. 즉, 금액을 출금하는 작업과 입금하는 작업이 모두 성공적으로 완료되어야 하며, 하나라도 실패하면 전체 트랜잭션이 롤백되어야 합니다.
  3. 무결성 제약 조건 준수: 모든 이체 후 계좌의 잔액은 반드시 0보다 크거나 같아야 합니다. 마이너스 잔액은 허용되지 않습니다.
  • 격리성(Isolation) : 트랜잭션은 다른 트랜잭션에 영향을 받지 않고 독립적으로 실행되어야 한다.
  • 지속성(Durability) : 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영되어야 한다.
    • 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 복구할 수 있어야 한다.

격리 수준

  • READ_UNCOMMITTED (level 0)
    • 트랙잭션에 처리중인 혹은 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
    • 어떤 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 B라는 아직 완료되지 않은 Dirty 데이터를 읽을 수 있다.
    • Dirty Read : 다른 트랜잭션에서 처리 작업이 끝나지 않았는데 읽을 수 있는 것 (READ_UNCMMITED에서만 발생하는 현)
      • 예를 들어, 트랜잭션 A가 데이터를 수정하고 있지만 아직 커밋하지 않았는데, 트랜잭션 B가 그 수정 중인 데이터를 읽으면, 트랜잭션 A가 롤백되어 수정이 취소된 경우 B는 잘못된(더 이상 존재하지 않는) 데이터를 읽게 됩니다.
  • READ_COMMITTED (level 1)
    • 트랜잭션이 커밋되어 확정된 데이터만 읽는 것을 허용한다.
    • Dirty Read 현상은 방지할 수 있지만 Non-Repeatable Read를 현상이 발생할 수 있다.
      • Non-Repeatable Read : 한 트랜잭션 내에서 같은 데이터를 두 번 조회했을 때 두 조회 결과가 다른 경우 발생하는 현상이다.
      • 트랜잭션에서 2번 SELECT를 하고 첫 번째 SELECT와 두 번째 SELECT 사이에 B 트랜잭션에서 수정을 한다면 A 트랜잭션의 두 SELECT 쿼리는 서로 다른 결과를 가지고 있게 된다.
  • REPEATABLE_READ (level 2)
    • 트랜잭션이 완료될 때 까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능하다. (읽기는 가능)
      • 한 트랜잭션 동안 두 번의 SELECT 쿼리가 일어난다면 이 격리 level에서는 그 트랜잭션 동안 데이터 수정이 불가능해서 두 쿼리의 값이 동일하게 되는 것이다.
    • Non-Repeatable을 방지할 수 있지만 여전히 Phantom Read 문제는 발생한다.
      • Phantom Read : 한 트랜잭션 내에서 같은 쿼리를 두 번 실행했을 때 결과 집합의 행이 다른 경우 발생합니다.
      • 즉, Phantom Read삽입, 삭제에 관한것이고 Non-Repeatable Read수정에 관한 것이다.
  • SERIALIZABLE (level 3)
    • 트랜잭션이 완료될 때까지 읽기, 수정, 입력이 모두 불가능하다.