자격증/정보처리기사 실기

정처기 실기 - 데이터베이스 Transaction

비뀨_ 2023. 6. 7. 13:23

1. 트랜잭션

데이터를 보장하기 위해서 DBMS가 가지는 특성이다.

또, DBMS에서 하나의 논리적 기능을 정상적으로 수행하기 위한 단위이다.

 

2. 트랜잭션의 특성

  • 원자성 (Atomic) 
    • 트랜잭션을 구성하는 작업 모두 정상적으로 실행되거나 모두 취소되어야 하는 성질
      • Commit / Rollback
      • 회복성 보장
  • 일관성 (Consistency)
    • 시스템의 고정요소는 트랜잭션 수행 전과 이후 모두 같아야 하는 성질
      • 무결성 제약조건
      • 동시성 제어
  • 격리,고립성(isolation)
    • 동시에 실행되는 트랜잭션들이 서로 영향을 끼치지 않는 성질
      • Read Uncommitted
      • Read Committed
      • Repeatable Read
      • Serializable
  • 영속성 (durabillity)
    • 성공이 완료된 트랜잭션의 결과는영속적으로 DB에 저장되어야하는 성질. 

 

* 격리, 고립성의 고립화 수준 *

위에서 말 한 대로 고립(Isolation)에서는 4가지의 기법이있다.

트랜잭션 고립화 수준(Transaction Isolation Level)은 트랜잭션의 독립성, 고립성을 유지하기 위해 데이터에 대한 접근을 허용하는 수준을 말한다. Locking 기술을 기반으로 고립화 수준을 조정하며 4개의 레벨로 구성되어 있다.

 

고립화의 수준에 따라 발생할 수 있는 문제점들이 있는데, 수준이 높아질 수록 문제점이 줄어든다.

 

1) 부정 판독(Dirty Read)

부정 판독은 다른 Transaction에 의해 수정되었지만, 아직 Commit되지 않은 데이터를 읽는 것을 말한다.

예를 들어보자.

더보기

아래 이미지처럼 트랜잭션 A의 작업 중 insert 구문으로 TB_BB에 데이터가 삽입되고 commit되지 않았을 때 

트랜잭션 B가 TB_BB의 가장 마지막 데이터를 가져오는 작업을 수행한다.

만약에 트랜잭션 A의 작업이 rollback이 되면 트랜잭션 B는 존재하지 않는 값을 가리키는 상태에 놓이게 된다. 

이걸 부정 판독(Dirty Read)라고 한다.  

 

2) 비반복 판독(Non-repeatable Read)

한 트랜잭션에서 같은 데이터를 두 번 이상 읽을 때, 중간에 다른 트랜잭션이 값을 갱신하거나, 삭제해 읽은 값이 서로 다르게 되는 형상이다.

더보기

아래 이미지에서 트랜잭션 A에서 두 개의 회원의 이름을 찾는 select 구문을 실행한다. 

근데 도중에 트랜잭션 B가 '철수'의 값을 '영희'로 변경했다. 

그럼 두번째 select에서는 회원의 이름을 찾을 때 '철수'가 아닌 '영희' 값을 찾게 된다.

 

3) 팬텀 판독(Phantom Read)

한 트랜잭션에서 같은 데이터를 두번 이상 읽을 때, 중간에 다른 트랜잭션이 값을 갱신하거나 삭제함으로써 읽은 값이 서로 다르게 되는 현상.

 

더보기

예를 들어서 회원 목록을 조회하는 중에, 트랜잭션 B에서 회원이 추가되면

트랜잭션 A에서는 첫번째 조회에서 없었던 데이터가 새로 뿅하고 나타날 수 있게 된다.

고립화 수준 유형

Lv.0  - Read Uncommitted

한 트랜잭션에서 Commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.

작업 중인 데이터를 수정하는 것은 불가하다.

Select 문을 수행하는 경우 그 데이터에 Shared Lock이 걸리지 않는 레벨이다.

 

부정, 비반복, 팬텀 판독 모두 발생.

Lv.1  - Read Committed

트랜잭션에서 작업을 수행할 때, 작업이 끝날 때까지 작업의 대상 데이터에 대한 읽기를 제한한다.

작업이 완료되어 commit된 데이터는 다른 트랜잭션이읽는 것을 허용한다.

 

부정 판독을 방지해 준다. 대부분의 DBMS가 기본으로 채택함.

Lv.2  - Repeatable  Read

선행 트랜잭션이 특정 데이터를 읽을 때, 트랜잭션 종료 시까지 해당 데이터에 대한 갱신 / 삭제를 제한한다.

 

비반복 판독을 방지해준다. 

Lv.3 - Serializable

선행 트랜잭션이 특정 데이터 영역을 순차적으로 읽을 때, 해당 데이터 영역 전체에 대한 접근을 제한한다.

 

팬텀 판독을 방지해준다.

 

 

정리하자면 위처럼 고립화 수준이 높아질수록 좋아보이지만, 작업을 할 때 막는 부분이 커지기 때문에 성능 상에서 문제가 생길 수 있으니 무조건 높다고 좋은 것은 아니다!

 

3. 트랜잭션의 상태 변화

  • 활동 (Active) - 초기 상태. 트랜잭션이 실행 중일 때 가지는 상태
  • 부분 완료(Partially Committed) - 마지막 명령문이 실행된 후에 가지는 상태
  • 완료 상태(Committed) - 트랜잭션이 성공적으로 완료된 후 가지는 상태
  • 실패 상태(Failed) - 정상적인 실행이 더 이상 진행될 수 없을 때 가지는 상태.
  • 철회 상태(Aborted) - 트랜잭션이 취소되고, DB가 트랜잭션 시작 전 상태로 되돌린 상태

 

4. 트랜잭션 제어

TCL(Transaction Controll Language) 라고 하며 트랜잭션의 결과를 허용하거나, 취소하는 목적으로 사용한다.

  • Commit - 트랜잭션을 확정시켜서 메모리에 영구저장하게 만드는 명령어
  • Rollback - 트랜잭션 내역을 저장 무효화시키는 명령어
  • Checkpoint - 저장 시기 설정. Rollback을 위한 시점을 지정하는 명령어

 

5. 병행 제어(일관성 주요 기법)

개념

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

 

목적

  • 데이터베이스의 공유를 최대화한다.
  • 시스템의 활용도를 최대화한다.
  • DB의 일관성을 유지한다.
  • 사용자에 대한 응답시간을 최소화한다.

 

병행 제어를 하지 않을 시의 문제점

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

병행 제어 기법

  • 로킹(Locking)
    • 하나의 트랜잭션이 실행되는 동안 특정 데이터 항목에 대해 다른 트랜잭션이 동시에 접근하지 못하도록
      상호배제(Mutual Exclusion) 기능을 제공하는 기법
    • DB, File, Record 등은 로킹 단위가 될 수 있음.
    • 로킹 단위가 작아지면 DB 공유도가 증가
    • 로킹 단위가 작아지면 로킹 오버헤드 증가
    • 한번에 로킹할수 있는 객체의 크기를 로킹 단위라고 함.
  • 낙관적 검증(Obtimistic Validation)
    • 트랜잭션이 어떤검증도 수행하지 않고, 트랜잭션을 수행한후 트랜잭션 종료 시 검증을 수행해 DB에 반영
  • 타임 스탬프 순서(Time Stamp Ordering)
    • 트랜잭션과 트랜잭션이 읽거나 Update한 데이터에 대해 트랜잭션이 실행을 시작하기 전 타임 스탬프를 부여해
      부여된 시간에 따라 트랜잭션 작업을수행하는 기법 
  • 다중버전 동시성 제어(MVCC : Multi Version Concurrency Control)
    • 트랜잭션의 타임스탬프와 접근하려는 데이터의 타임스탬프를 비교해 직렬가능성이 보장되는 적절한 버전을 선택해 접근하도록 하는 기법

 

6. 회복 기법(영속성 주요 기법)

개념

트랜잭션을 수행하는 중 장애로 인해 손상된 DB를 손상되기 이전의 정상 상태로 복구시키는 작업

 

회복 요소

REDO UNDO가 있으며, 모두 DB가 비정상 종료되었을 때를 기반으로 진행한다 

  • REDO
    • Disk에 저장된 로그를 분석해 트랜잭션의 시작과 완료에 대한 기록이 있는 트랜잭션들의 작업을 재작업하는 기법
    • DB 내용 자체가 손상되었을 경우, 최근에 복재본을 적재한 후 이후 일어난 변경만을 Log를 이용해 재실행 
  • UNDO
    • Disk에 저장된 로그를 분석해 트랜잭션의 시작은 있지만, 완료 기록이 없는 트랜잭션들이 작업한 변경 내용을 
      모두 취소한다.
    • DB 내용 자체가 손상되지 않았지만, 변경 중이거나 변경된 내용에 대한 신뢰성을 잃어버린 경우, 모든 변경 내용을 취소해 복원하는 기법

회복 기법 종류

  • 로그 기반 회복 기법
    • 지연 갱신 회복 기법 : 트랜잭션이 완료되기 전까지 DB에 기록하지 않는 기법
    • 즉각 갱신 회복 기법 : 트랜잭션 수행 중 갱신 결과를 바로 DB에 반영하는 기법
  • 체크 포인트 회복 기법 : 장애 발생 시 검사점 이후에 처리된 트랜잭션에 대해서만 이전의 상태로 복원
  • 그림자 페이징 회복 기법 : DB 트랜잭션 수행 시 복제본을 생성해 DB 장애 시 이를 통해 복구