본문 바로가기

카테고리 없음

트랜잭션, ACID(원자성,일관성,지속성,격리성), 트랜잭션 격리 수준

반응형

1. 트랜잭션이란?

  • 트랜잭션을 이름 그대로 번역하면 거래라는 뜻이다.
  • 데이터베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해주는 것을 뜻한다.
  • 데이터를 저장할 때 데이터베이스에 저장하는 이유 중 대표적인 것은 데이터베이스는 트랜잭션이라는 개념을 지원하기 때문이다.
  • 예를 들어 계좌이체라는 거래는 A의 잔고 감소, B의 잔고 증가 이렇게 2가지 작업이 합쳐져서 하나의 작업처럼 동작해야 한다.
  • 데이터베이스가 제공하는 트랜잭션 기능을 사용하면 2가지 둘다 함께 성공해야 저장하고, 중간에 하나라도 실패하면 거래전의 상태로 2가지 모두 돌아가야 한다.
  • 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것을 커밋( Commit )이라 하고,
  • 작업 중 하나라도 실패해서 거래이전으로 되돌리는 것을 롤백( Rollback )이라 한다.

2. 트랜잭션 ACID

  • 트랙잰션은 아래 4가지를 보장 해야한다.
  • 원자성(Atomicity) : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 묶어서, 모두 성공 하거나 모두 실패해야 한다. 여러 SQL 명령어를 마치 하나의 작업인 것 처럼 처리할 수 있다. 성공하면 한번에 반영하고, 중간에 실패해도 마치 하나의 작업을 되돌리는 것 처럼 간단히 되돌릴 수 있다
  • 일관성(Consistency) : 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
  • 지속성(Durability) :트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다. 트랙잰션 커밋했는데 중간에 시스템 문제 발생하여도 디비 로그같은것들 통해서 성공한 트랙잰션 내역을 복구할 수 있어야 한다. 복구하면 커밋된게 정확하게 들어가 있어야 한다.
  • 격리성(Isolation) : 동시에 실행되는 트랜잭션들(멀티쓰레드 동시요청)이 서로에게 영향을 미치지 않도록 독립적으로 실행되게 하여 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준(Isolationlevel)을 선택할 수 있다.

3. 트랜잭션 격리 수준

  • 트랜잭션 간에 격리성을 완벽히 보장하려면 트랜잭션을 거의 순서대로 실행해야 한다.
  • 이렇게 하면 동시 처리 성능이 매우 나빠진다. 이런 문제로 인해 ANSI 표준은 트랜잭션의 격리 수준을 4단계로 나누어 정의했다
  • 트랜잭션 격리 수준 - Isolation level ( 위 단계로 갈수록 격리성 보장이 높아지지만, 성능이 느려짐)
  1. READ UNCOMMITED(커밋되지 않은 읽기) : 다른곳에서 데이터 변경중으로 커밋되지 않은 상황인데, 데이터가 보이는 심각한 문제 가능성 있지만, 성능은 좋음
  2. READ COMMITTED(커밋된 읽기 - 보통 많이 사용)
  3. REPEATABLE READ(반복 가능한 읽기 - 보통 많이 사용)
  4. 4 )SERIALIZABLE(직렬화 가능)

4. 트랜잭션의 동작 개념

  • 1. 트랜잭션 시작
  • 2. 데이터 변경 - 등록, 수정, 삭제(커밋을 호출하기 전까지는 임시로 데이터를 저장. 해당 트랜잭션을 시작한 세션(사용자)에게만 변경 데이터가 보이고 다른 세션(사용자)에게는 변경 데이터가 보이지 않음으로써 데이터 정합성에 문제가 없다.)
  • 3-1).커밋 : 쿼리를 실행하고 데이터베이스에 그 결과를 반영하려면 commit 호출
  • 3-2).롤백 : 결과를 반영하고 싶지 않으면 rollback 을 호출 > 트랜잭션을 시작하기 직전의 상태로 복구
반응형