Computer Science/DB

트랜잭션(Transaction)

nauni 2021. 5. 12. 07:40

DB 응용

  • OLTP(OnLine Transaction Processing)
    • 복수의 사용자에서 발생되는 트랜잭션을 DB가 처리하고 돌려주는 과정
    • 응답속도가 빠름
    • 데이터 처리가 얼마나 정확하고 무결한지가 중요
    • index 로 데이터에 소량 접근하여 소량의 읽기를 해오는 경우
    • 데이터 수정이 비교적 많이 일어나는 경우
  • OLAP(OnLine Analytical Processing)
    • 데이터를 분석하여 유의미한 정보를 제공해주는 처리방법
    • 오래 걸림, 상대적으로 응답속도가 느림
    • 다량의 데이터를 다량으로 읽기를 하는 경우

Transaction(트랜잭션)

  • 트랜잭션의 영어 의미는 "거래"
  • 무언가를 주고 받는 행위를 의미
  • DB에서는 쪼갤 수 없는 작업의 단위를 의미
  • ACID(Atomicity, Consistency, Isolation, Durability) 4가지 특성을 가짐
  • 데이터 부정합을 방지하고자 사용

1. Atomicity(원자성)

  • All or Nothing
  • 전혀 수행되지 않거나 완전히 수행되어야 한다.
  • 트랜잭션의 단위는 원자성을 가지며 하나의 묶음이 쪼갤 수 없는 작업의 단위가 됨
  • A가 B에게 1000원을 주고 아이스크림을 사는 경우, 돈을 지불하고 아이스크림을 받는 전체가 하나로 이루어져야 한다. 중간에 돈만 나가고 아이스크림을 받지 못하는 상태가 생기면 안 됨
1. A.money -= 1000
2. B.money += 1000
3. A.bag += IceCream
4. B.bag -= IceCream

2. Consistency(일관성)

  • 트랜잭션을 수행하고 나면 하나의 일관된 상태(Correct Status)에서 다른 일관된 상태로 바뀌어야 한다.
  • 일관된 상태(Correct State): 도메인의 유효범위, 기타 제약조건 등을 위반하지 않는 상태
  • Correct State -----(Transaction)-----> Correct State
  • 예시, 잔액이 0이상이어야 하는 경우(제약조건)
1. 1000원을 가지고 있다.
2. +200원
3. -1500원
=> 잔액이 -300이 되므로 정상상태가 아님

1. 1000원을 가지고 있다.
2. -1500원
3. +1600원
=> 결과적으로 +100인 상황이므로 정상상태임
  • 일시적으로 비정상상태이더라도 최종 결과는 정상상태이므로 트랜잭션 수행이 가능

3. Isolation(고립성)

  • 한 트랜잭션이 실행되는 동안 외부에서는 트랜잭션 접근이 불가
  • 싱글스레드처럼 동작한다는 의미(한번에 하나의 트랜잭션만 수행하면 항상 고립성은 보장)
  • 실제로는 동시에 여러 트랜잭션이 수행되지만 한번에 하나씩 수행한 것과 동일한 결과를 가져야 함
  • OS의 세마포어(semaphore)와 비슷한 개념으로 lock & execute unlock을 통해 고립성 보장
  • 데이터를 읽을 때, 여러 트랜잭션이 읽을 수 있도록 허용하는 shared_lock을 함(readOnly)
  • 데이터를 쓸 때, 다른 트랜잭션이 읽고 쓸수 없도록 exclusive_lock을 사용
  • lock, unlock을 잘못 사용시 데드락 상태 가능성 => 2PL(2 Phase Locking protocol) 이 고안됨
  • 2PL 프로토콜: 여러 트랜잭션이 공유하고 있는 데이터를 동시에 접근할 없도록 하기 위한 목적
  • 2단계의 locking(growing phase: read_lock, write_lock & shrinking phase: unlock)
  • growing phase 다음에 shrinking phase가 실행되게 되어 있음
  • 보통 트랜잭션이 commit 을 만날때까지 lock 상태를 가지고 있다가 commit 되면 unlock 됨

4. Durability(지속성)

  • 완료(commit)된 트랜잭션은 영구적으로 보존되야야 함
  • JDBC connection 에서 자동 커밋이 기본설정
  • commit 되어야 데이터가 반영이 완료됨

Recovery

  • commit: 트랜잭션의 완료를 나타내는 용어
  • 버퍼캐시가 disk 에 쓰여지기 전에 항상 관련 redo, undo 가 먼저 쓰여진다.
  • redo: 쿼리문을 다시 발생시킬 수 있을 만큼의 충분한 정보를 가짐
  • undo(rollback): 쿼리문이 다시 없던 일로 만들 수 있을 만큼의 충분한 정보를 가짐
  • 검사점(checkpoint) 이후의 장애(failure)시점을 기준으로 undo와 redo를 판단
    redo,undo

이미지출처:https://victorydntmd.tistory.com/130

DBMS 간략한 구조

DMBS 구조

이미지 출처:https://d2.naver.com/helloworld/407507

  • 질의처리기(Query Processor)와 저장시스템(Storage System)으로 나뉨
  • 데이터를 고정길이 페이지로 저장하며, 디스크에서 읽거나 쓸 때 페이지 단위의 입출력이 이루어짐
  • 페이지 관리 모듈: 페이지 버퍼, 버퍼 관리자라고 함
  • 버퍼에서 디스크에 작성되어야 데이터가 저장됨
  • 페이지들이 버퍼 관리자의 교체알고리즘에 따라 디스크에 출력

Transaction Isolation Levels (4 단계)

READ UNCOMMITTED

  • commit, rollback 여부와 상관없이 다른 트랜잭션에서 값을 읽기 가능
  • 정합성에 문제가 꽤 많은 격리수준임
  • dirty read: 트랜잭션이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 현상

READ COMMITTED

  • commit 되어야만 다른 트랜잭션에서 조회 가능
  • 같은 트랜잭션이더라도 스냅샷이 다시 생성됨(consistent non-locking read)
  • update 경우, row에 걸린 lock이 걸렸지만, semi-consistent 읽기를 진행하여 최신 커밋된 버전으로 읽을 수 있음

REPEATABLE READ

  • Mysql에서 InnoDB의 기본 설정
  • 같은 트랜잭션의 처음상태의 스냅샷으로 읽음. consistent read 가 가능
  • 커밋된 내용에 대해서만 조회가능한 격리수준
  • 트랜잭션마다 id를 부여하여 트랜잭션id 보다 작은 번호에서만 변경한 것만 읽기 가능

SERIALIZABLE

  • 가장 엄격한 격리수준
  • InnoDB에서 조회작업은 잠금을 걸지 않고 동작하나 serializable에서는 읽기에서도 공유잠금을 설정함
  • 자동커밋이 켜져있다면 읽기도 하나의 트랜잭션으로 관리됨
  • 동시처리 능력이 다른 격리 수준보다 떨어지고 성능저하 발생

참고