트랜잭션

초콜렛빵·2022년 5월 19일
0

TIL

목록 보기
10/27

Transaction

트랜잭션이란?

  • 하나의 작업을 수행하기 위해 필요한 데이터베이스의 연산들의 모음
  • 데이터베이스의 논리적인 작업의 단위이며 장애 발생시 데이터 복구를 위한 작업의 단위
  • 이를 통해 트랜잭션의 모든 명령문이 완벽하게 처리되거나 하나도 처리되지 않아야 데이터베이스의 일관성을 유지가 가능
  • DBMS의 성능은 초당 트랜잭션의 실행 수(TPS: Transaction per second)로 측정

트랜잭션의 특성(ACID)

원자성(Automicity)

  • 트랜잭션 내부에서 실행된 작업들은 모두 성공해서 commit 혹은 문제 발생시 rollback으로 모두 취소
  • 즉, 일부분의 성공은 불가능하고 모두 성공 혹은 모두 실패만 가능
  • 원자성 보장은 DB 수정 시 지금까지 성공한 상태를 rollback segment에 저장하여 rollback 시 해당 영역으로 복구, 성공시에는 삭제

일관성(Consistency)

  • 모든 트랜잭션은 일관성있는 DB상태를 유지해야 함
  • 트랜잭션 전후의 DB 상태를 Correct State

    Correct State 는 도메인의 유효 범위, 무결성 제약조건등의 제약조근을 위배하지 않은 상태를 의미

독립성(Isolation)

  • 둘 이상의 트랜잭션이 동시에 실행되고 있는 경우, 어떤 하나의 트랜잭션이 다른 트랜잭션의 연산에 끼어들 수 없음

지속성(Durability)

  • 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영되어야 함

@Transaction(트랜잭션 어노테이션)

  • Spring에서 제공하는 트랜잭션 처리가 가능한 어노테이션
  • 메소드뿐 아니라 인터페이스, 클래스에서도 선언해서 사용 가능

@Transactional의 옵션

  1. isolation
    • 트랜잭션에서 일관성 없는 데이터의 허용 수준
  2. propagation
    • 트랜잭션 동작 도중 다른 트랜잭션 호출 시 동작 방식
  3. noRollbackFor
    • 특정 예외 발생 시 rollback하지 않음
  4. rollbackFor
    • 특정 예외 발생 시 rollback
  5. timeout
    • 지정한 시간 내에 메소드 수행 완료되지 않으면 rollback(-1 이면 사용하지 않는 것과 동일)
  6. readOnly
    • 트랜잭션을 읽기 전용으로 설정

isolation(격리 레벨)

  1. DEFAULT: 기본 격리 수준
    • DB의 Isolation Level을 따름
  2. READ_UNCOMMITED(level0) : 커밋되지 않은 데이터에 대한 읽기 허용
    • A를 B로 변경할 때, 다른 사용자가 B로 변경된 데이터로 읽을 수 있게 됨
    • Dirty Read 발생
      • Dirty Read: 트랜잭션 A가 수정중인 데이터를 트랜잭션 B가 읽을 수 있고, rollback이 된다면 트랜잭션 B가 읽은 데이터는 잘못된 데이터(데이터 정합성을 어김
  3. READ_COMMITED (level1) : 커밋된 데이터에 대해 읽기 허용
    • A를 B로 변경할 때, 다른 사용자는 해당 데이터 접근 불가능
    • Dirty Read 미발생
  4. REPEATABLE_READ (level2): 동일 필드에 대해 다중 접근 시 모두 동일한 결과 보장
    • 트랜잭션 완료 시까지 SELECT 문장이 사용되는 데이터에 대한 shared lock이 발생
    • 다른 사용자는 그 영역에 해당하는 데이터에 대한 수정 불가능
    • 선행 트랜잭션이 읽는 데이터에 대해 종료 전까지 후행 트랜잭션을 갱식, 삭제가 불가능
    • Non-Repeatable Read 방지
      • Non-repeatable Read: 트랜잭션 A가 조회중인 데이터를 트랜잭션 B가 수정하고 커밋하면 트랜잭션 A가 재조회시에 해당 데이터가 수정되어 나타남. 즉, 반복해서 같은 데이터가 나타나지 않는 다는 것
  5. SERIALIZABLE (level3): 가장 높은 격리, 성능 저하의 우려 존재
    • 데이터의 일관성 및 동시성을 위해 MVCC(Multi Version Concurrency Control)을 사용하지 않음
    • 트랜잭션 완료 까지 SELECT 가 사용하는 모든 데이터에 shared lock 발생
    • Phantom Read 방지

      MVCC란, 다중 사용자 DB성능을 위한 기술로 데이터 조회시 LOCK을 사용하지 않고 데이터의 버전을 관리하여 일관성 및 동시성을 높이는 기술

      • Phantom Read: 트랜잭션 A가 조회한 데이터에 트랜잭션 B가 데이터를 추가하고 커밋한 뒤 트랜잭션 A가 재조회하면 데이터가 추가되어 나타남. 즉, 반복 조회시 결과 집합이 달라짐
  • 트랜잭션의 격리 수준을 높게 설정하는 것을 통해 데이터 무결성 유지 가능하지만, 레벨이 높아짐에 따라 성능이 떨어지고 비용이 높아짐

Propagation(전파속성)

  1. REQUIRED(Default)
    • 이미 진행중인 트랜잭션이 있다면 해당 트랜잭션 속성을 따르며, 없는 경우 새로운 트랜잭션 생성
  2. REQUIRES_NEW
    • 항상 새로운 트랜잭션 생성하며, 이미 진행중인 트랜잭션이 있으면 보류한 후 해당 트랜잭션을 선행
  3. SUPPORT
    • 이미 진행중인 트랜잭션이 있다면 해당 트랜잭션 속성을 따르며, 없다면 트랜잭션 설정하지 않음
  4. NOT_SURPPORT
    • 이미 진행중인 트랜잭션이 있다면 보류한 후 트랜잭션 없이 작업 수행
  5. MANDATORY
    • 이미 진행중인 트랜잭션이 있어야 진행하고, 없으면 Exception 발생
  6. NEVER
    • 트랜잭션이 진행중이지 않을 때 작업 수행하며, 트랜잭션이 있으면 Exception 발생

참조

profile
차근차근 기록하고 배우는 개발자

0개의 댓글