[TIL] DB : 트랜잭션(transaction)

은경·2022년 1월 23일
0

1. 트랜잭션이란 ?


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

  • 하나의 트랜잭션은 Commit되거나 Rollback된다.
  • 따라서 데이터 베이스의 회복과 병행 제어가 가능하다.
  • SQL문으로 표현된다
  • 트랜잭션의 모든 명령문이 완벽하게 처리되거나 <-> 하나도 처리되지 않아야한다.
    • 완벽하게 처리되면 커밋(commit)을 하고, 오류 발생 시 원래 상태대로 롤백(rollback)을 한다.(하나도 처리되지 않음)
  • 트랜잭션은 데이터베이스의 데이터 부정합을 방지하고자 할 때 사용한다.

트랜잭션은 은행에서 송금하는 경우의 예시를 가장 많이 든다.


2. 트랜잭션의 성질(ACID)


데이터베이스의 트랜잭션이 안전하게 수행되기 위해서는 ACID 조건을 충족해야 한다.

1️⃣ 원자성 (Atomicity)

  • All or Noting
  • 트랜잭션의 연산들이 모두 완벽히 수행되던지, 오류가 있다면 하나도 실행되지 않아야 함.
  • 100개의 명령어로 구성된 트랜잭션 중 1개라도 실패가 된다면 무조껀 실패로 간주하여 롤백 해야함.
  • A에서 B로 돈을 이체할 때 A와 B 계좌의 돈의 총합이 같아야 함.
  • 원자성 보장
    • 이전에 커밋된 상태를 임시영역에 저장
    • 현재 트랜잭션에서 오류 발생시 날려버리고 임시영역에 커밋되었던 상태로 롤백 -> 이 영역을 롤백 세그먼트 라고한다.

2️⃣ 일관성 (Consistency)

  • 트랜잭션의 수행이 성공적으로 완료된 후에도 데이터베이스가 일관성 있는 상태를 유지해야 함.
  • 트랜잭션 실행 전의 DB상태와 실행 후의 DB상태가 각각 일관성이 보장되는 서로 다른 상태여야 함 .

3️⃣ 고립성 (Isolation)

  • 여러 트랜잭션 수행시 다른 트랜잭션의 연산 작업이 끼어들 수 없다.
  • 현재 수행중인 트랜잭션이 완료(커밋)될 때까지 중간 연산 결과에 다른 트랜잭션이 접근할 수 없음.
  • 트랜잭션은 서로 영향을 받지 않고 각각 독립적으로 수행

4️⃣ 지속성 (Durability)

  • 트랜잭션의 성공적인 완료 후에는 데이터베이스에 영구적으로 작업 결과가 반영 되어야 함.
  • 비 휘발성 메모리에 데이터가 저장됨.
  • 커밋을 하면 현재 상태가 영원히 보장된다는 것을 의미.
  • 부분 완료 시에는 작업을 취소 해야함.

3. 특징


💡 무정지성

서버장애가 발생해 데이터베이스를 재가동시 장애 직전 까지의 커밋 결과를 손실하지 않고 마치는 것이 가능

  • 트랜잭션을 지원하지 않는 DB는 OS장애가 발생하거나, 프로세스가 비정상적으로 종료되면 DB가 손상될 수 있다.
  • 오라클과 같은 트랜잭션 대응 DB는 REDO로그를 이용한 아키텍처로 무정지성을 보장함.
    • REDO 로그 : 커밋 시 캐시영역에 보관, 주기적으로 디스크에 기록 -> REDO 로그는 상대적으로 최신 커밋 정보를 가짐. DB 재기동시 REDO 로그의 내용을 데이터파일에 적용하므로써 충돌 복구 과정을 수행

💡 트랜잭션의 상태

  • 활동 : 트랜잭션 실행중
  • 실패 : 트랜잭션 실행에 오류가 발생해 중단됨
  • 철회 : 트랜잭션이 비정상 종료되어 롤백 된 상태
  • 부분 완료 : 트랜잭션의 마지막 연산까지 실행, 커밋 직전
  • 완료 : 트랜잭션이 성공적으로 종료후 커밋 한 상태

4. 연산


💡 커밋(Commit)

  • 모든 작업들을 정상적으로 처리했다고 확정하는 명령어
  • 트랜잭션이 수행이 성공적으로 완료되었음을 선언하고 데이터베이스에 영구적으로 저장.
  • 커밋하면 하나의 트랜잭션 과정이 종료되고 데이터가 업데이트 됨.

💡 롤백(Rollback)

  • 작업 중 문제 발생 시 트랜잭션의 처리과정에서 발생한 변경사항을 취소하는 명령어
  • 일부만 정상적으로 처리되도 모든 트랜잭션의 연산을 취소하고 이전의 상태로 되돌림.(마지막 커밋 시점)
  • 롤백 시에는 해당 트랜잭션을 재 시작하거나 폐기.

    세이브 포인트(Save Point)
    임시 저장, 부분 저장 -> 전체 취소가 아닌 특정부분을 취소할 때 사용
    트랜잭션 분할 가능.
    확실한 부분에 대해서는 롤백이 되지 않도록 중간 저장 지점을 지정할 수 있음.

5. 회복 (Recovery)


회복은 트랜잭션들을 수행하는 도중 장애 발생 시 데이터베이스가 손상되었을 때 손상되기 이전의 정상 상태로 복구하는 작업.
DBMS의 구성 요소인 Recovery Management 가 복구하는 역할을 담당.

💡 연기 갱신 기법(Deferred Update)

  • 트랜잭션의 성공적으로 완료될 떄 까지 대이터베이스에 갱신을 연기하는 방법.
  • 트랜잭션 중 갱신된 내용은 Log에 보관
  • 트랜잭션 부분완료 시점에 Log보관 내용을 실제 데이터베이스에 기록
  • 완료 전 롤백되면 따로 취소할 필요없이 무시하면 됨 (로그에 보관중이기 때문)
  • Redo 작업만 가능

💡 즉각 갱신 기법(Immediate Update)

  • 트랜잭션이 데이터를 갱신하면 부분 완료 전이라도 즉시 데이터베이스에 반영
  • 장애 발생시 회복 작업을 대비해 갱신된 내용들은 Log에 보관
  • 회복 작업을 할때 RedoUndo 사용 가능

💡 그림자 페이지 대체 기법(Shadow Paging)

  • 갱신전 DB를 일정크기의 페이지 단위로 구성 -> 각 페이지마다 복사본(그림자 페이지)으로 별도 보관
  • 실제 페이지에 트랜잭션으로 갱신 작업 시 장애 발생-> 롤백 시킬 때, 갱신된 이후의 실제 페이지 부분에 그림자 페이지를 대체하여 회복
  • Log, Undo, Redo 알고리즘이 필요없음.

💡 검사점 기법(Check Point)

  • 특정 단계에서 재 실행이 가능하도록 갱신내용 등의 정보와 함께 검사점을 log에 보관, 장애 발생 시 트랜잭션 전체를 철회하지 않고 검사점 부터 회복 작업 진행 -> 회복 시간 절약

6. 트랜잭션 병행 제어 (Concurrency Control)


다수의 사용자가 데이터베이스에 요청을 보내면 병행처리 방식으로 진행.
효율이 높아지나, 동일한 자료를 동시에 접근해서 오류 발생 가능.

병행 처리의 문제점

종류발생 상황문제점
갱신 유실 문제두 트랜잭션이 동시에 동일한 자료를 갱신첫째 갱신이 유실
오류 읽기 문제갱신하는 도중에 다른 트랜잭션이 읽기낡은 자료 읽기
잘못된 요약두 자료를 갱신하는 도중에 읽기요약 결과 오류
무결성 제약조건두 자료의 제약조건을 검사하지 않고 갱신일관성 위반

따라서 트랜잭션 병행 제어가 필요하다.

💡 트랜잭션 병행 제어의 목적

  • 데이터베이스 일관성 유지
  • 트랜잭션의 충돌 방지, 고립성 강제화
  • 데이터베이스 공유 최대화
  • 시스템의 활용도 최대화
  • 사용자에 대한 응답시간 최소화

💡 병행 제어 기법

  1. 락킹(Locking)

    • 하나의 트랜잭션이 데이터를 액세스하는 동안 다른 트랜잭션은 그 데이터를 액세스할 수 없게 함.
    • 트랙잭션은 액세스 전 Lock을 요청하고 액세스를 마치고 Lock을 해제
  2. 타임 스탬프 순서화(Time stamp Ordering)

    • 트랜잭션 간의 순서를 미리 정하여 제어하는 방법
    • 트랜잭션 하나의 실행이 완료되면 다른 트랜잭션을 시작하는 방식
    • 직렬화 기법임.
  3. 낙관적 기법

    • 읽기 전용 트랜잭션이 대부분일 때는 병행 제어를 하지 않아도 문제가 없음.
    • 검증과 확인하는 과정이 필요
  4. 다중 버전 기법

    • 타임 스탬프 기법을 이용하며 버전을 부여하여 관리하는 기법

참고 자료 (Reference)


https://brunch.co.kr/@skeks463/27
http://wiki.hash.kr/index.php/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98#cite_note-.ED.8A.B8.EB.9E.9C.EC.9E.AD.EC.85.98_.EC.84.B1.EC.A7.882-1
https://velog.io/@guswns3371/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-ACID#acid
https://ehpub.co.kr/tag/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EB%B3%91%ED%96%89-%EC%A0%9C%EC%96%B4%EC%9D%98-%EB%AA%A9%EC%A0%81/
https://subsay.tistory.com/40

profile
Back-end 개발자

0개의 댓글