트랜잭션 - 개념 이해

현시기얌·2022년 6월 10일
0

데이터베이스

목록 보기
3/16
post-custom-banner

트랜잭션 - 개념 이해

데이터를 저장할 때 단순히 파일에 저장해도 되는데 데이터베이스에 저장하는 이유는 무엇일까?
가장 대표적인 이유는 데이터베이스가 트랜잭션이라는 개념을 지원하기 때문이다.

  • 트랜잭션을 이름 그대로 번역하면 거래라는 뜻이다.
  • 데이터베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해주는 것을 뜻한다.
  • 그런데 하나의 거래를 안전하게 처리하려면 생각보다 고려해야 할 점이 많다.
  • 예를 들어서 A의 5000원을 B에 계좌이체한다고 생각해보자. A의 잔고를 5000원 감소하고 B의 잔고를 5000원 증가해야 한다.

5000원 계좌 이체

  1. A의 잔고를 5000원 감소
  2. B의 잔고를 5000원 증가
  • 계좌이체라는 거래는 이렇게 2가지 작업이 합쳐져서 하나의 작업처럼 동작해야 한다.
  • 만약 1번은 성공했는데 2번에서 시스템에 문제가 발생하면 계좌이체는 실패하고 A의 잔고만 5000원 감소하는 심각한 문제가 발생한다.
  • 데이터베이스가 제공하는 트랜잭션 기능을 사용하면 1,2 둘다 함께 성공해야 저장하고, 중간에 하나라도 실패하면 거래 전의 상태로 돌아갈 수 있다.
  • 만약 1번은 성공했는데 2번에서 시스템에 문제가 발생하면 계좌이체는 실패하고 거래전의 상태로 완전히 돌아갈 수 있다.
  • 결과적으로 A의 잔고가 감소하지 않는다.
  • 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것을 커밋(Commit)이라 하고 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것을 롤백(Rollback)이라 한다.

트랜잭션 ACID

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

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

트랜잭션 격리 수준

  • READ UNCOMMITED(커밋되지 않은 읽기)
  • READ COMMITTED(커밋된 읽기)
  • REPEATABLE READ(반복 가능한 읽기)
  • SERIALIZABLE(직렬화 가능)
profile
현시깁니다
post-custom-banner

0개의 댓글