본문 바로가기
데이터베이스

트랜잭션

by wwns 2023. 9. 7.
반응형

데이터베이스에 데이터를 삽입, 삭제, 수정, 조회를 하기 위해선 커넥션을 통해 쿼리를 보내며 이 커넥션이 어떻게 관리되는지 알아보았다

또한 데이터베이스의 성능, 데이터 무결성, 이상현상을 고려하면서 데이터 모델링의 정규화, 반정규화를 공부하였다

 

이번에는 다시 데이터베이스를 조작하는 기능을 수행할 때 이 일련의 과정을 어떻게 관리하는지를 알아보고자 한다


트랜잭션이란?

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

 

일련의 연산들이란 SELECT, UPDATE, INSERT, DELETE와 같은 연산을 말하며 즉, 트랜잭션은 SELECT, UPDATE, INSERT, DELETE 연산을 수행하여 데이터베이스의 상태를 변화시키는 작업의 단위

 

작업의 단위는 여러 연산들의 집합이라고 생각할 수 있다 

따라서 어떠한 연산들을 묶어 트랜잭션을 설계할 것인지는 중요한 요소이다


트랜잭션의 특징

트랜잭션을 설계하는 것이 데이터베이스를 사용함에 있어 중요한 요소로 작용될 수 있다

따라서 트랜잭션은 어떤 특징을 가지고 있는지 파악해야 트랜잭션의 범위를 설계할 수 있다

 

트랜잭션은 대표적으로 4가지 특징을 가진다

 

  • 원자성(Atomicity)
    • 트랜잭션이 데이터베이스에 모두 반영되던지, 아니면 전혀 반영되지 않아야 한다 -> All or Nothing
    • 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다
      • Mysql에선 MVCC를 통해 기능을 지원
        • 트랜잭션 시작 -> Update -> Update이전 데이터는 Undo Log -> 트랜잭션 실패 시 Undo log로 되돌아간다 -> Atomicity를 보장하기 위해 언두로그를 관리
      • 트랜잭션이 종료되었을 때 데이터 무결성이 보장된다
  • 일관성(Consistency)
    • 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다
    • 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 수행 완료 후의 상태가 같아야 한다
  • 독립성(Isolation)
    • 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도 다른 트랜잭션의 연산에 끼어들 수 없다
      • 마찬가지로 Mysql의 MVCC 기능을 통해 지원
      • 트랜잭션에서 연산이 수행되면 이전의 값을 Undo Log에 기록함으로써 다른 트랜잭션의 연산에 결과가 반영되지 않음 (Commit 되기 전까지)
    • 수행 중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다
  • 지속성(Durability)
    • 트랜잭션이 성공적으로 완료되었을 경우, 결과는 영구적으로 반영되어야 한다
      • 데이터베이스 성능의 핵심 disk I/O이다 만약 쓰기 작업이 일어날 때마다 디스크에 밀어 넣는 것은 성능이 저하됨
      • 메모리는 휘발성이므로 유실될 수 있음
        • Write Ahead Log 통해 순차적으로 로그를 쌓기 때문에 장애가 발생하여 다운되어도 데이터베이스를  기동할  WAL 보고 처리되지 못한 데이터를 처리함 (Mysql의 InnoDB에서는 Redo Log)

트랜잭션 Commit, Rollback

트랜잭션의 범위 내에서 연산을 수행하면 각 연산에 대해서 commit을 하며 정상적으로 수행했음을 알린다

만약 연산을 수행하는 도중 에러 혹은 비정상 종료가 된다면 트랜잭션의 특징 중 원자성을 만족하기 위해 처음의 상태로 돌아가야 하는데 이때 rollback을 수행한다

 

Commit

  • 하나의 트랜잭션이 성공적으로 끝나서 데이터베이스가 일관성 있는 상태에 있음을 의미한다

Rollback

  • 하나의 트랜잭션 처리가 비정상적으로 종료되었을 때의 상태로 데이터베이스의 일관성이 깨졌을 때 수행한다
  • Rollback이 이뤄진다면 트랜잭션을 다시 실행하거나 부분적으로 변경된 결과를 취소한다

트랜잭션의 상태

https://wonit.tistory.com/462

트랜잭션은 논리적으로 5가지의 상태에 있을 수 있다

  • Active
    • 트랜잭션이 실행 중인 상태
  • Failed
    • 트랜잭션에서 오류가 발생해서 중단된 상태
  • Aborted
    • 트랜잭션이 비정상 종료되어 Rollback 이 수행된 상태
  • Partially Committed
    • 트랜잭션의 연산이 마지막까지 실행되고 최종 결과가 Commit 되기 직전 상태
  • Committed
    • 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
     

정리

  • 트랜잭션이란 무엇인가요?
    • 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위, 즉 SELECT, UPDATE, INSERT, DELETE와 같은 연산들의 묶음을 말합니다
  • 트랜잭션의 특징은 어떤 것이 있나요?
    • 트랜잭션의 특징은 크게 4가지로 정리할 수 있습니다
    • 원자성
      • 하나의 트랜잭션 범위의 연산들을 모두 반영하던지, 아니면 모두 반영하지 않아야 한다
    • 일관성
      • 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다
    • 독립성
      • 둘 이상의 트랜잭션이 연산을 수행하고 있을 때 어떤 트랜잭션이 다른 트랜잭션의 연산에 끼어들 수 없다
    • 지속성
      • 트랜잭션이 성공적으로 반영되었을 경우, 결과는 영구적이어야 한다
  • 트랜잭션의 커밋과 롤백에 대해서 설명해주세요
    • Commit은 하나의 트랜잭션이 성공적으로 수행되어 데이터베이스가 일관성 있는 상태에 있음을 의미
    • Rollback은 하나의 트랜잭션의 연산이 비정상적으로 처리되었을 때 트랜잭션을 시작하기 전의 상태로 돌아가기 위한 작업을 의미

간단한 트랜잭션의 정의, 특징에 대해서만 정리하였다

 

추후에 DBMS를 보면 트랜잭션의 특징과 데이터의 일관성을 잃지 않도록 하기 위해 비정상 처리 상황에 대해 어떤 복구 전략을 사용하고 있는지 알아볼 필요가 있다

 

Mysql의 Undo Log를 언급하면서 동시성에 대한 얘기를 살짝 꺼내었다 결국 로그를 통해 여러 버전을 관리한다는 것은 복잡하고 저장 비용이 존재한다

따라서 트랜잭션의 락을 통한 동시성 제어 방법도 고려해 볼 수 있으며  이어서 정리해 보도록 하자!

반응형

'데이터베이스' 카테고리의 다른 글

동시성 제어와 Snapshot Isolation  (0) 2023.09.11
트랜잭션 격리수준  (0) 2023.09.09
데이터베이스 반정규화  (1) 2023.09.06
데이터베이스 정규화  (0) 2023.09.06
데이터베이스 커넥션 풀  (0) 2023.09.05