트랜잭션이란?

  • DBMS에서 하나의 최소한의 작업 단위이다.
  • 여러 사람이 데이터베이스를 동시에 사용하더라도 데이터에 문제가 없어야 한다.
  • 원자성, 일관성, 격리성, 지속성 = ACID가 지켜져야 함.
  • ex) 입출금 시스템

 


ACID 특성

  • 원자성(Atomicity) : 트랜잭션이 수행하는 연산들을 모두 정상적으로 처리하거나 모두 처리하지 않아야 한다는 all-or-nothing 방식
  • 일관성(Consistency) : 데이터베이스의 데이터는 일관된 상태를 유지해야 한다. ( = 미리 정의된 규칙에만 수정이 가능해 숫자 컬럼에 문자열값 X) //트랜잭션의 결과가 제약 조건을 해치면안된다.
  • 격리성(Isolation) : 하나의 트랜잭션이 완료될 때까지 다른 트랜잭션이 간섭하지 못하도록 하여 각각의 트랜잭션이 독립적으로 수행되어야 한다.
  • 지속성(Durability) : 트랜잭션이 성공적으로 완료된 이후에 데이터베이스의 데이터들이 영구적으로 보존되어야 한다. ( = 한 번 커밋된 내용은 영원히 적용)

트랜잭션 원자성을 위한 지키기위한 순서

  1. 쿼리실행
  2. 쿼리처리를 통해 필요한 데이터가 데이터 캐시가 없다면 데이터 파일에서 데이터 캐시에 저장
  3. Redo 로그에는 변경 후의 값을 저장하고 Undo 로그에는 변경 전의 값을 저장
  4. 이후 데이터 캐시 값을 변경
  5. ROLLBACK 을 할 경우 UnDo로그를 통해 역순으로 데이터를 복구한다.
  6. 롤백 이외에 예기치 못한 오류가 발생하면 ReDo 로그를 통해 데이터를 일관성있게 만들어 준다.
  • 결론 : 수행하고 있는 트랜잭션에 의해 변경된 내역과 이전에 commit 된 상태를 임시 영역에 따로 저장한다. 트랜잭션 오류 발생시 임시 저장된 데이터들을 기반으로 복구한다.
  • 이전 데이터가 임시 저장되는 영역을 롤백 세그먼트라고 한다.

→ 로그 기반 회복 기법

→ 체크포인트 기반 회복 기법도 있음

 


일관성 보장

  • 트리거를 통해 보장

 


고립성 보장

  • 트랜잭션은 성능을 위해 병행처리를 수행한다.
  • 이 경우 공통된 데이터를 조작하게 되어 고립성을 해칠 수 있다.
  • lock & excute unlock을 통해 고립성 보장 가능
  • 데이터를 읽거나 쓸 때는 문을 잠궈 다른 트랜잭션이 접근하지 못하도록 고립성을 보장하고, 수행을 마치면 unlock을 통해 데이터를 다른 트랜잭션이 접근할 수 있게 함
  • shared_lock은 데이터 쓰기를 허용하지 않고 오직 읽기만 허용 → 데이터를 읽기만 할때는 여러 트랜잭션이 읽을 수 있음 = 공유lock
  • 데이터를 쓸 때는 다른 트랜잭션이 읽을수도 쓸 수 도 없는 exclusive_lock을 사용한다. → 데드락에 빠질 수 있음 = 배타적 lock

트랜잭션 격리 수준

  1. Read Uncommitted
    • 트랜잭션 시작 후 아직 Commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용
    • 데이터베이스의 일관성을 유지하는 것이 불가능
      • Dirty Read 발생
  2. read committed
    • 트랜잭션 시작 후 Commit이 된 데이터만 조회 가능
    • Oracle DB, SQl Server에서 기본적으로 사용하는 Isolation Level
      • Non-Repeatable Read 발생
        • B 트랜잭션에서 10 번 사원의 나이를 조회 : 27
        • A 트랜잭션에서 나이 변경 27 → 28
        • B 트랜잭션에서 나이 조회 : 28
  3. repeatable read 
    • 트랜잭션 시작 전 commit된 내용만 조회 가
    • 트랜잭션 영역에 해당되는 데이터 수정 불가능
    • MySQL DBMS가 사용
    • Phantom Read 발생
      • 한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽었을 때 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 현상
      • 트랜잭션 도중 새로운 레코드 삽입을 허용하기 때문에 발생

4. serializable

  • 트랜잭션이 사용하는 영역의 데이터에 대한 수정 및 입력 불가능
  • 완벽한 읽기 일관성 모드를 제공

 

 


  1. Dirty Read란
    • 유효하지 않은 데이터를 읽음
      • A트랜잭션에서 10번 사원의 나이를 27 → 28 변경
      • A가 commit되기전에 B트랜잭션에서 10번 사원의 나이를 조회 = 28
      • 이후 A에 문제가 발생해서 Rollback 하면 B는 28인줄 알고있기 때문에 데이터 정합성에 문제가 생김
  2. Non-Repeatable Read
    • 두번의 쿼리 조회 결과가 다름
      • A가 500번 사원 조회
      • B가 500 사원 이름 변경 후 커밋
      • A가 500번 사원 조회 : Undo 영역에 백업된 데이터 반환
  3. Phantom Read
    • 일정 범위의 레코드를 두 번 이상 읽을 때 이전에 없던 레코드가 나타남

트랜잭션 데드락

  • 두 개 이상의 트랜잭션이 특정 자원을 획득한 채 다른 lock을 요구하면 상태가 바뀌지 않는 교착상태를 의미

2 phase locking

 

  • 여러 트랜잭션이 공유하고 있는 데이터에 동시에 접근할 수 없도록 하는 프로토콜
  • growing phase (상승단계) : lock과 unlock이 번갈아 수행되지 않고 lock을 할때는 쭉 lock을 수행
  • shrinking phase(하강단계) :lock이 끝난 후 모든 unlock을 수행
  • DBMS는 일관성을 유지하기 위해 무결성 제약조건을 활용함.
  • DBMS는 고립성을 유지하기 위해 동시성 제어 알고리즘을 작동시킴.
  • DBMS는 지속성을 유지하기 위해 회복 관리자 프로그램을 이용함.트랜잭션이란?
    • DBMS에서 하나의 최소한의 작업 단위이다.
    • 여러 사람이 데이터베이스를 동시에 사용하더라도 데이터에 문제가 없어야 한다.
    • 원자성, 일관성, 격리성, 지속성 = ACID가 지켜져야 함.
    • ex) 입출금 시스템

BELATED ARTICLES

more