[DB] DB Transaction

김우진·2021년 11월 26일
0

DB, MySQL, SQL

목록 보기
1/5

이 글은 매컴싸 발표 준비 자료로 "DB Transaction에 관한 내용 + 마지막에 Spring의 @Transactional에 관한내용 조금" 을 다루고 있습니다.

Spring의 @Transactional에 대해 자세히 알고 싶으신 분은 하단의 출처의 Spring docs를 참고하시면 좋을 것 같습니다.

Transaction

데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산

  • 데이터베이스 시스템에서 병행 제어 및 회복 작업(recovery) 시 처리되는 작업의 논리적 단위

    회복(Recovery)

    • 트랜잭션 도중에 손상된 데이터베이스를 이전 상태로 복귀하는 작업
    • 트랜잭션의 연산을 수행할 때 데이터베이스를 변경하기전에 로그 데이터를 생성
    • 취소(Undo) 연산으로 이미 데이터베이스에 쓰여진 것도 수정할 수 있다.
  • 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업단위
  • 하나의 트랜잭션은 Commit 되거나 Rollback된다.

-> 데이터베이스의 상태를 변환시키는 논리적 단위 이므로 CRUD 중 C, U, D에서 사용함

Transaction의 필요성

계좌이체로 A은행에서 B은행으로 돈을 송금하려고 하는 경우,
송금 중 알 수 없는 오류로 인해 A은행에서 돈은 빠져나갔지만, B은행의 계좌엔 입금되지 않는 상황이 발생할 수 있다.

위와 같은 상황을 막기위해선
1. A은행 계좌의 잔액에서 이체한 금액만큼 빼는 일
2. B은행 계좌의 잔액에서 해당 금액만큼 더하는 일
이 쪼개어져선 안된다.

이러한 것을 막기위해 Transaction으로 논리적 기능을 수행하기 위한 작업의 단위를 나눠놓았다.

Transaction 연산

Commit 연산

한 개의 트랜잭션에 대한 작업이 성공적으로 끝나고 데이터베이스가 다시 일관된 상태에 있을 때, 이 갱신 또는 변환가 완료된 것을 트랜잭션 관리자에게 알려주는 연산

Rollback 연산

하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성이 깨진 경우, 이 트랜잭션의 일부가 정상적으로 처리 되었더라도 이 트랜잭션이 행한 모든 연산을 취소하는 연산

Rollback 연산시에는 해당 트랜잭션을 재시작하거나 폐기한다.

-> 전체 연산을 취소하는 이유는 트랜잭션의 원자성 성질 때문에 (아래에서 다룸)

Transaction 상태

  • 활성(Active) : 트랜잭션이 정상적으로 실행중인 상태
  • 부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태
  • 완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
  • 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
  • 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태

Transaction 성질 (ACID)

원자성(Atomicity)

  • 트랜잭션의 연산은 데이터베이스에 모두 반영되던지 전혀 반영되지 않던지 해야한다.
  • 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되야 하며, 모두가 완벽히 수행되지 않고 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.
  • A는 B에게 10000원을 준다.
  • B는 A에게 물건을 준다.
    이 둘 중 하나만 처리되면 안된다.

일관성(Consistency)

  • 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 잇는 데이터베이스 상태로 변환한다.
  • 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 후의 상태(Correct State)가 같아야 한다.
  • 잔액: 0보다 커야한다.
  • 성별: 남/여/기타
    등의 성질은 트랜잭션 연산 후에도 동일해야함
    연산후에 잔액이 "-(마이너스)"를 허용하거나 성별에 "금액"등이 들어가선 안된다.

독립성, 격리성(Isolation)

  • 둘 이상의 트랜잭션이 동시에 병행 실행될 경우 어느 하나의 트랜잭션 실행중에 다른 트랜잭션 연산이 끼어들 수 없다.
  • 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션의 수행 결과를 참조할 수 없다.

A가 어떠한 value를 가져오려 할 때, 그 사이 B가 value 값을 변경한 경우 A는 원하는 value값이 아닌 다른 value값을 가져오게 된다.

영속성, 지속성(Durablility)

  • 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 한다.

트랜잭션 완료 후 컴퓨터가 꺼지더라도 데이터는 이미 저장되었으므로 보존된다.
만약 완료 전에 컴퓨터가 꺼졌다면 원자성 원칙에 따라 트랜잭션 수행 전으로 rollback된다.

Spring에서 트랜잭션 처리 방법

튜터님께서 DB의 Transaction과 Spring @Transactional이 완벽히 같지 않으며, 이에 혼동이 오지 않게 설명할 것을 말씀해주셔서 가볍게만 다루려 합니다. 자세한 내용은 아래 키워드 혹은 공식 문서에서 확인하시길 바랍니다.

스프링에서 트랜잭션 처리를 지원하는 방법으로 @Transactional을 선언하여 사용하는 어노테이션 방식이 있다. 이를 선언적 트랜잭션이라고 한다.

클래스 혹은 메서드위에 @Transactional 추가되면, 이 클래스에 트랜잭션 기능이 적용된 프록시 객체가 생성이된다.

이 프록시 객체는 PlatformTransactionManager를 사용하여 작동여부에 따라 Commit 또는 Rollback한다.

PlatformTransactionManager interface

Spring의 트랜잭션 인프라의 중앙 인터페이스로 어플리케이션은 주로 AOP를 통해 TransactionTemplate 또는 선언적 트랜잭션과 함게 작동한다.(Commit이나 Rollback과 관련된 연산 수행해주는 친구 같음)

[트랜잭션 proxy 호출 단계]

다루지 않은 연관된 Keyword

  • 다수의 트랜잭션이 경쟁 시 발생할 수 있는 문제
    • Dirty Read
    • Non-Repeatable Read
    • Phantom Read
  • DeadLock
  • AOP
  • 스프링 트랜잭션 속성
    • isolation(격리수준)
    • propagation(전파옵션)
    • readOnly
    • timeout

출처

  1. 코딩팩토리 blog : [MSSQL] Update문 사용법 & 예제(트랜잭션)
  2. 코딩팩토리 blog : [DB기초] 트랜잭션이란 무엇인가?
  3. 갓대희님의 blog : [Spring] Transactional 정리 및 예제
  4. spring.io api docs : Interface PlatformTransactionManager
  5. spring.io api docs : Annotation Type Transactional
  6. spring.io docs의 16.3, 16.5 : 16. Transaction Management
  7. 튜나(devuna)님의 blog : [DB]트랜잭션(Transaction)이란?/트랜잭션의 개념,특징, 연산과정/savepoint

0개의 댓글