DATABASE

[DB] 트랜잭션

집한구석 2021. 5. 16. 09:59
728x90

정의 

  • 데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위, 한꺼번에 모두 수행되어야하는 일련의 연산
  • ACID라 하는 원자성, 일관성, 격리성, 지속성을 보장해야함

ACID

  • 원자성(Atomicity) : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공 or 모두 실패 해야함
  • 일관성(Consistency) : 모든 트랙잭션은 일관성 있는 데이터베이스 상태를 유지해야함 (무결성 제약조건을 항상 만족해야함)
  • 격리성(Isolation) : 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리 (동시에 같은 데이터를 수정하지 못하도록 함, 격리성은 동시성과 관련된 성능 이슈로 인해 격리수준을 선택할 수 있음)
  • 지속성(Durability) : 트랜잭션을 성공적으로 끝내면 결과가 항상 기록되어야 함 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야함

트랜잭션간에 격리성을 완벽히 보장하려면 트랜잭션을 차례대로 실행해야함, 이럴경우 동시성 처리 성능 기능 이 나빠짐 이러한 문제로 인해서 격리수준 4단계를 나누어서 정의함 


격리수준 

  • READ UNCOMMITED : 커밋되지 않은 읽기
  • READ COMMITED : 커밋된 읽기
  • REPEATABLE READ : 반복 가능한 읽기
  • SERIALIZABLE : 직렬화 가능

격리 수준이 낮을 수록 동시성은 증가하지만, 수준이 낮을 수록 다양한 문제가 발생함


격리 수준에 따른 문제점 

격리 수준 DIRTY READ NON-REPEATABLE READ PHANTOM READ
READ UNCOMMITED O O O
READ COMMITED   O O
REPEATABLE READ     O
SERIALIZABLE      
  • READ UNCOMMITED :  커밋하지 않은 데이터를 읽을수 있음 
  • READ COMMITED : 커밋한 데이터만 읽을 수 있음
  • REPEATABLE READ : 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회
  • SERIALIZABLE : 가장 높은 격리 수준, 동시성 처리 성능이 떨어질 수 있음

격리 수준 설명 예시

  • DIRTY READ : 트랜잭션 A가 데이터를 수정하는데, 트랜잭션 B가 수정중인 데이터 조회
  • NON-REPEATABLE READ : 트랜잭션 A가 a를 조회중인데, 트랜잭션 B가 a를 수정하고 커밋하면, 트랜잭션 A가 다시 조회했을 때 수정된 데이터가 조회, 반복해서 같은 데이터를 읽을 수 없는 상태를 나타냄 
  • PHANTOM READ : 트랜잭션 A가 학생 A반 그룹인 회원 a를 조회했는데, 트랜잭션 B가 학생 A반 그룹에 b,c를 추가하고 커밋하면, 트랜잭션 A가 조회했을 때 회원 하나가 추가된 상태로 조회, 반복조회시 결과 집합이 달라지는 것을 나타냄

애플리케이션은 동시성 처리가 중요하기 때문에 데이터베이스들은 보통 READ COMMITED 격리 수준을 기본으로 사용 

'DATABASE' 카테고리의 다른 글

[DB] REPLICATION(리플리케이션)  (0) 2021.11.13
[DB] 쿼리 처리 과정  (0) 2021.06.26
[DB] 인덱스 (INDEX)  (0) 2021.06.24
[DB] 샤딩  (0) 2021.06.02
[MySQL] 쿼리 튜닝 기초  (0) 2020.12.15