[CS-데이터베이스] DB 트랜잭션

지영·2023년 7월 6일
0

CS

목록 보기
40/77

트랜잭션이란,

  • DBMS에서 데이터를 다루는 논리적인 작업의 단위
  • 데이터베이스에서 데이터를 다루는 작업 중에 장애가 발생할 때 데이터를 복구하는 작업의 단위

사용 명령어

1. Commit

  • 하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성있는 상태에 있을 때. 하나의 트랜잭션이 끝났다는 것을 관리자에게 알려주기 위함.

  • 연산을 사용하면 트랜잭션이 로그에 저장

2. Rollback

  • 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우, 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산되 결과를 다시 취소
- 활동(Active) : 트랜잭션이 실행중인 상태
- 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
- 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
- 부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산	이 실행되기 직전의 상태
- 완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태

3. Redo

"다시하다"라는 의미. 기본적으로 복구의 역할을 함.

4. Undo

"원상태로 돌리다"라는 의미. 작업 롤백과 읽기 일관성, 복구를 한다. Redo와의 차이점은 Redo는 사용자가 했던 작업을 그대로 다시 해서 복구하는 반면, Undo는 사용자가 했더 작업을 반대로 진행한다.

  • 상태 변화 -> SQL 질의어를 통해 DB에 접근하는 것
	1. SELECT
	2. INSERT
	3. DELETE
	4. UPDATE
  • 작업 단위 -> 많은 SQL 명령문들을 사람이 정하는 기준에 따라 정하는 것
    상황예시) 사용자 A가 사용자 B에게 만원을 송금한다.
     * 필요한 DB작업 
     	1. 사용자 A의 계좌에서 만원을 차감한다. : UPDATE문 사용
         2. 사용자 B의 계좌에서 만원을 추가한다. : UPDATE문 사용
     * 현재 작업 단위 : 출금 UPDATE문 + 입금UPDATE문 = 트랜잭션 하나
     	- 위 두 쿼리문 모두 성공적으로 완료되어야만 '하나의 작업(트랜잭션)"이 완료된다. **'Commit'**
         - 작업 단위에 속하는 쿼리 중 하나라도 실패하면 모든 쿼리문을 취소하고 이전 상태로 되돌려야 한다. **'Rollback'**

🔎특징

  • 원자성(Atomicity)
    : All or Nothing, 트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 한다.

  • 일관성(Consistency)
    : 트랜잭션의 작업 처리 결과는 항상 일관성 있어야 한다.

  • 독립성(Isolation)
    : 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.

  • 지속성(Durability)
    : 트랜잭션이 성공적으로 완료되었다면, 결과는 영구적으로 반영되어야 한다. 시스템이 고장나더라고도 데이터베이스에 반영, 손실이 없다. 문제가 만약 생긴다면, DBMS의 회복모듈이 그 상태를 반영한다.

트랜잭션 관리를 위한 DBMS의 전략

📍 그 전에 알면 좋은 지식
1. DBMS의 구조 : 질의 처리기 + 저장 시스템

  • 페이지 버퍼 : DBMS의 저장 시스템에 속하는 모듈. 메인메모리에 유지하는 페이지를 관리하는 모듈, 즉 페이지 버퍼의 모듈에 따라 UNDO, REDO를 결정한다.

UNDO

  • 왜 UNDO가 필요한가?
    INSERT, UPDATE, DELETE 같은 오퍼레이션이 실행될때 버퍼 관리자의 정책에 따라서 디스크에 수정된 페이지가 반영될 수 있다. 여기서 중요한건 아직 트랜잭션이 커밋되지 않았더라도 수정된 페이지가 디스크에 반영될 수 있다는 것이다

  • 메모리 버퍼의 크기가 커야한다. : 수정된 페이지들이 트랜잭션이 커밋되야지만 디스크에 반영된다면 트랜잭션이 진행되는 동안에는 메모리에 모든 수정된 페이지가 저장되기 때문이다.

수정된 페이지가 디스크에 반영되는 시점을 기준으로 두 가지 정책이 존재한다.

  1. STEAL : 수정된 페이지를 언제든지 디스크에 쓸 수 있는 정책
  2. ~STEAL : 수정된 페이지를 트랜잭션 종료 시점까지는 버퍼에 유지하는 정책

REDO

커밋한 트랜잭션의 수정 사항을 재반영하는 방식으로 복구 작업을 실행한다.

  1. FORCE : 수정한 모든 페이지를 트랜잭션 커밋 시점에 디스크로 출력한다.
  2. ~FORCE : 수정한 모든 페이지가 트랜잭션 커밋 후에도 디스크에 반영 안될 수도 있다.

🔐 트랜잭션과 LOCK(동시성 제어, 병행 제어)

Lock이란,

  • 트랜잭션의 순차성을 보장하기 위한 방법
  • DBMS마다 Lock을 구현하는 방식과 세부적인 방법이 다름

Lock의 종류

공유락(Shared Lock)

  • 읽을 때 사용되어지는 Lock
  • 공유 Lock들끼리는 동시에 접근이 가능 : 하나의 데이터를 여러 사용자가 읽을 수 있다는 의미!
  • 공유 Lock이 설정된 데이터에 베타 Lock을 설정해놓을 수는 없음

베타락(Exclusive Lock)

  • 데이터를 변경할 때 사용되며, 트랜잭션이 완료될 때까지 유지
  • 베타락이 해지될 때까지는 다른 트랜잭션이 해당 데이터에 접근할 수 없음.
  • 베타락이 수행되고 있는 데이터에 대해서는 다른 락을 설정할 수 없음.

1) Lock-based protocols

  • lock : 데이터 마다 가지고 있는 하나의 변수
  • 각 트랜잭션이 수행을 시작하고 데이터에 접근할 때마다 요청한 락에 대한 정보는 락 테이블에 유지
  • UPDATE를 목적이라면 베타락을 요청
  • READ가 목적이라면 공유락을 요청
  • 접근이 끝나면 락을 해제한다.(unlock)

2) Timestamp-based concurrency control(non-lock concurrency control)

  • timestame를 사용해서 트랜잭션을 다룸

  • timestamp : 모든 트랜잭션이 가지게 됨. 고유한 값을 가지며 나중에 시작한 트랜잭션이 더 큰 timestamp를 가지게 된다. 따라서 트랜잭션의 timestamp끼리 값을 비교할 수 있고 서로 충돌이 발생했을 때 어떤 작업이 먼저 수행되어야 할 지를 알 수 있다.

  • 데이터베이스의 RTS : 해당 데이터를 READ할 때마다 갱신됨

  • 데이터베이스의 WTS : 해당 데이터를 WRITE할 때마다 갱신됨

profile
꾸준함의 힘을 아는 개발자가 목표입니다 📍

0개의 댓글