CS

[DB] 트랜잭션(Transaction, ACID)

KJihun 2023. 10. 27. 16:13
728x90

트랜잭션(Transaction) 

DB에서 사용되는 업무 처리의 최소 단위

 

 

 

트랜잭션의 특성 : ACID

  • Atomicity: 원자성
    • 트랜잭션을 구성하는 연산 전체가 모두 정상 실행되거나 모두 취소되어야 한다

 

  • Consistency: 일관성
    • 시스템이 가진 고정요소는 트랜잭션 수행 전과 후의 상태가 같아야 한다

 

  • Isolation: 격리성, 고립성
    • 동시에 실행되는 트랜잭션은 서로 영향을 미치지 않아야 한다

 

value desc
DEFAULT 기본 설정값(READ_COMMITTED)
READ_UNCOMMITTED 다른 트랜잭션이 commit하지 않은 데이터를 읽을 수 있다.
READ_COMMITTED 다른 트랜잭션이 commit한 데이터를 읽을 수 있다
REPEATABLE_READ 처음 읽은 데이터와 두번째 읽은 데이터가 동일한 값을 갖는다.
SERIALIZABLE 동일한 데이터에 대해 2개 이상의 트랜잭션이 동시에 수행될 수 없다.

 

  • Durability: 영속성
    • 성공된 트랜잭션의 결과는 영속적으로 DB에 저장되어야 한다

 

 

트랜잭션의 상태

  • Active : 초기상태, 트랜잭션이 실행 중일 때 가지는 상태
  • Partially Committed : 마지막 명령문이 실행된 후에 가지는 상태
  • Comitted : 트랜잭션이 성공적으로 완료 후 가지는 상태
  • Failed : 정상적인 실행이 더 이상 진행될 수 없을 때 가지는 상태
  • Aborted : 트랜잭션이 취소되고 DB가 트랜잭션 시작 전 상태로 환원된 상태
    •  

 

 

트랜잭션 제어어(TCL)

  • COMMIT : 트랜잭션을 메모리에 영구적으로 저장하는 명령어
  • ROLLBACK : 트랜잭션 내역을 저장 무효화 시키는 명령어
  • CHECKPOINT : ROLLBACK을 위한 시점을 지정하는 명령어

 

 

병행제어 : 다수 사용자 환경에서 여러 트랜잭션을 수행할 때, DB일관성 유지를 위해 상호 작용을 제어하는 기법

  • 목적 : DB 공유 및 시스템 활용도 최대화, DB일관성 유지, 사용자에 대한 응답시간 최소화

 

  • 병행제어 미보장 시 문제점
    • 갱신손실(Lost Update) : 먼저 실행된 트랜잭션의 결과를 나중에 실행된 트랜잭션이 덮어 쓸 때 발생
    • 현황 파악오류(Dirty Read) : 트랜잭션의 중간 수행 결과를 다른 트랜잭션이 참조하여 발생
    • 모순성(Inconsistency) : 두 트랜잭션이 동시에 실행되어 DB의 일관성이 결여되는 오류
    • 연쇄복귀(Cascading Rollback) : 복수의 트랜잭션이 데이터 공유 시 특정 트랜잭션이 처리를 취소할 경우 트랜잭션이 처리한 곳의 부분을 취소하지 못하는 오류

 

  • 병행제어 기법 종류
    • Locking : 하나의 트랜잭션을 실행하는 동안 사용중인 데이터에 다른 트랜잭션이 접근하지 못하도록 상호배제(Mutual Exclusion)기능을 제공
      • DB, 파일, 레코드 등은 로킹 단위가 될 수 있음
      • 로킹 단위가 작아지면 : DB 공유도 증가, 로킹 오버헤드 증가
    • 낙관적 검증 : 트랜잭션 수행 후 종료 시 검증을 수행하여 DB에 반영하는 기법
    • 타임 스탬프 순서 : 트랜잭션 수행 전 타임 스탬프를 부여해 부여된 시간에 따라 트랜잭션 작업을 수행하는 기법
    • 다중버전 동시성 제어(MVCC) : 트랜잭션의 타임스탬프와 데이터의 타임스탬프를 비교하여 적절한 버전을 선택하여 접근하도록 하는 기법

 

 

DB 고립화 수준(Isolation Level) : 다른 트랜잭션이 현재의 데이터 무결성을 해치지 않게 하기 위해 잠금을 설정하는 것

  • Read uncommitted (Level 0) : commit 되지 않고 처리 중인 데이터를 다른 트랜잭션이 읽을 수 있음(연산은 불가능)
  • Read committed (Level 1) : 트랜잭션은 commit 된 데이터만 읽을 수 있음(대부분의 DBMS에서 기본으로 채택)
  • Repeatable Read (Level 2) : 선행 트랜잭션이 데이터를 읽는 경우 종료 전까지 다른 트랜잭션의 갱신/삭제 불가능
  • Serializable (Level 3) : 선행 트랜잭션이 데이터를 읽는 경우 종료 전까지 다른 트랜잭션의 영역 전체(갱신/삭제/삽입)에 대한 접근을 제한

 

회복 기법 : 장애로 인해 손상된 DB를 손상되기 이전의 정상적인 상태로 복구시키는 작업

  • 로그 기반 회복 기법 : 디스크에 저장된 로그를 분석해 트랜잭션의 상태 파악 후 REDO, UNDO 방법 실행
    • REDO, UNDO
      • REDO : 트랜잭션의 시작(Start)과 완료(Commit)에 대한 기록이 있는 트랜잭션들을 재작업하는 기법
      • UNDO : 시작(Start)만 있고 완료(Commit)되지 않은 트랜잭션들이 작업한 내용을 모두 취소하는 기법
    • 지연 갱신 기법(Deferred Update) : 트랜잭션이 완료 전까지 DB에 기록하지 않는 기법(REDO만 가능)
    • 즉각 갱신 기법(Immediate Update) : 트랜잭션 수행 중 갱신결과를 바로 DB에 반영하는 기법(Redo, Undo 모두 사용 가능)
  • 체크 포인트 회복 기법 : 체크포인트 이후에 처리된 트랜잭션만 장애 발생 이전의 상태로 복원시키는 회복 기법
  • 그림자 페이징 회복 기법 : DB 트랜잭션 수행 시 복제본을 생성해 DB 장애 발생 시 복제본을 이용해 복구하는 기법

 

 

 

@Transactional 어노테이션 사용 시, 접근제어자가 public이어야 한다. 왜 private면 사용할 수 없는걸까?

 

Spring은 AOP를 사용해서 @Transactional 처리하고, 이 과정에서 프록시 객체를 생성한다.

프록시 객체는 원본 객체의 메서드를 호출하기 때문에 접근 제어자가 private인 메서드에 접근할 수 없다.

'CS' 카테고리의 다른 글

[JPA] ORM, JPA  (1) 2023.10.30
[JPA] Propagation  (0) 2023.10.27
[JPA] 영속성 컨텍스트 및 이점(5가지)  (0) 2023.10.27
[Design Pattern] 가교 패턴(브릿지 패턴, Bridge Pattern)  (0) 2023.10.26
[Design Pattern] 퍼사드(Facade) 패턴  (0) 2023.10.26