type
status
date
slug
summary
tags
category
icon
password

트랜잭션

데이터베이스의 상태를 변환시키는 하나의 논리적인 기능을 수행하는 작업 단위
 

하는 이유

데이터의 안정성, 정합성을 보장하기 위해 사용한다.
이를 충족하기 위한 약속으로 ACID를 정의함
 

ACID

원자성(Atomicity)

트랜잭션이 더 이상 작게 쪼갤 수 없는 최소한의 업무 단위 모두 반영되거나 전부 반영되지 않아야 함(Commit, Rollback)

일관성(Consistency)

실행을 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환

독립, 격리성(Isolation)

하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없음

지속성(Durability)

트랜잭션의 결과는 시스템이 고장이 나더라도 영구적으로 반영됨
 

트랜잭션 상태 전이도

  • 활동(Active) : 트랜잭션이 실행 중인 초기 상태
  • 실패(Failed): 오류가 발생하여 중단된 상태
  • 철회(Aborted) : Rollback 연산이 수행된 후의 상태
  • 부분 완료(Partially Committed) : Commit 연산이 실행되기 직전의 상태
  • 완료(Committed) :트랜잭션이 성공적으로 완료된 후의 최종 상태
 

격리 수준

Lv
isolation 레벨/문제
Dirty Read
Non-repeatable Read
Phantom Read
0
READ-UNCOMMITTED
O
O
O
1
READ-COMMITTED
X
O
O
2
REPEATABLE-READ
X
X
O
3
SERIALIZABLE
X
X
X
위로 올라갈수록 속도는 빠르지만 데이터의 일관성을 보장하지 못함
아래로 내려갈수록 속도는 느리지만 데이터의 일관성을 보장할 수 있음
 
 

READ-UNCOMMITTED

커밋되지 않은 데이터를 읽을 수 있다
  • Dirty Read 발생
  • 동시 처리 성능이 높지만, 데이터의 일관성이 낮음
  • 데이터의 일관성보다 동시 처리 성능이 중요한 경우에 사용
 

READ-COMMITTED

커밋된 데이터만 읽을 수 있다
  • 실제 테이블 값을 가져오는 것이 아닌 undo 영역에 백업된 레코드에서 값을 가져옴
  • Non-repeatable Read와 Phantom Read가 발생
  • 데이터의 일관성, 동시 처리 성능이 중간 정도
  • 데이터의 일관성과 동시 처리 성능 사이의 균형이 중요한 경우에 사용
 

REPEATABLE-READ

한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회된다
  • 트랜잭션마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게 시킴
  • Undo 공간에 백업해두고 실제 레코드 값을 변경. 불필요해지면 주기적으로 삭제함 단, Undo에 백업된 레코드가 많아지면 서버 성능 저하될 수 있음
  • 데이터의 일관성이 높지만, 동시 처리 성능이 낮음
  • 데이터의 일관성이 중요한 경우에 사용

SERIALIZABLE

가장 단순 하며 엄격한 격리 수준
  • 데이터의 일관성이 가장 높지만, 동시 처리 성능이 가장 낮음
  • 데이터의 일관성이 매우 중요한 경우에 사용
 

문제

Dirty read

트랜잭션이 커밋되지 않은 데이터를 읽는 현상
 

Non-repeatable Read

한 트랜잭션 내 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션 값을 수정, 또는 삭제함으로써 두 쿼리가 다르게 나타나는 현상
 

Phantom Read

다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안 보였다가 하는 현상
락(Lock)Oracle DB에 접속하기까지..(on linux)
Loading...