[DB] 트랜잭션(Transaction)

joyful·2021년 7월 6일
7

CS

목록 보기
3/14

1. 개요

  • 정보의 교환이나 데이터베이스 갱신 등 연관되는 작업들에 대한 일련의 연산
    • 데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위

      💡 데이터베이스의 상태 변화
      질의어(SQL)를 이용하여 데이터베이스에 접근하는 것
      ex) SELECT, INSERT, DELETE, UPDATE

    • 한꺼번에 모두 수행되어야 할 일련의 연산들
  • 쪼갤 수 없는 업무 처리의 최소 단위(=거래내역)
  • 데이터베이스의 무결성이 보장되는 상태에서 요청된 작업을 완수하기 위한 작업의 기본 단위

2. 목적

  • 데이터 부정합 방지
    • 데이터베이스 서버에 여러 개의 클라이언트가 동시에 액세스하는 경우
    • 응용프로그램이 갱신을 처리하는 과정에서 중단될 수 있는 경우
  • 데이터베이스의 완전성(integrity) 유지 확신
    • 데이터베이스가 수행한 일부 쿼리가 남으면 안 됨
      ex) 송금시 한 계좌에서 인출 → 다른 계좌에서 입금 확인
    • 트랜잭션은 서로 간섭하면 안 됨
      ex) 쿼리 하나 실패 → 데이터베이스 시스템이 전체 트랜잭션 또는 실패한 쿼리 롤백
  • 거래의 안정성 확보
    • 테이블에서 데이터를 읽어옴
      → 다른 테이블에 데이터 입력/갱신/삭제 도중 오류 발생
      → 모든 작업 원상태로 되돌림
    • 처리 과정이 모두 성공했을 때만 최종적으로 데이터베이스에 반영
    • ex)

3. 특징

3.1 원자성(Atomicity)

  • 트랜잭션 연산은 데이터베이스에 모두 반영되든지 아니면 전혀 반영되지 않아야
  • 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 함

3.2 일관성(Consistency)

  • 트랜잭션이 실행을 성공적으로 완료시 언제나 일관성 있는 데이터베이스 상태로 변환
  • 시스템이 가지고 있는 고정 요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 함

3.3 독립성, 격리성(Isolation)

  • 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우, 어느 하나의 트랜잭션 실행 중 다른 트랜잭션의 연산이 끼어들 수 없음
  • 수행 중인 트랜잭션은 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없음
  • 기본적인 개념은 위와 같으나, 격리수준에 따라 수행 결과 참조 가능 여부가 달라짐

💡 트랜잭션 격리수준(Transaction Isolation Level)

특정 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용할지 말지 결정하는 것

  • READ UNCOMMITTED
    어떤 트랜잭션의 변경 내용이 COMMIT이나 ROLLBACK과 상관없이 다른 트랜잭션에서 보여짐
  • READ COMMITED
    어떤 트랜잭션의 변경 내용이 COMMIT 되어야만 다른 트랜잭션에서 조회 가능
  • REPEATABLE READ
    트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회 가능
  • SERIALIZABLE
    트랜잭션이 특정 테이블을 조회하면 다른 트랜잭션은 그 테이블의 데이터를 추가/변경/삭제 불가능

    → 아래로 갈수록 트랜잭션 간 고립 정도가 높아지고 성능이 떨어짐

3.4 영구성(Durability)

성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 함

4. 연산

💡 All or Nothing
트랜잭션은 모든 것을 수행하던지 아무것도 하지 말던지 방식으로 DML 명령어들을 처리함

4.1 커밋(commit)

  • 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어
  • 처리 과정을 데이터베이스에 영구적으로 저장
  • 커밋 수행 후
    • 하나의 트랜잭션 과정 종료
    • 이전 데이터가 완전히 업데이트 됨

4.2 롤백(rollback)

  • 작업 중 문제 발생으로 인해 트랜잭션의 처리 과정에서 발생한 변경 사항 취소하는 명령어
  • 트랜잭션의 일부가 정상적으로 처리돼도 트랜잭션이 행한 모든 연산 취소
    원자성 구현
  • 트랜잭션 시작되기 이전의 상태로 되돌림
    • 마지막 커밋 완료한 시점으로 되돌아 감
    • 마지막으로 수행한 커밋 명령까지만 정상 처리된 상태로 유지
    • 커밋하여 저장한 것만 복구
  • 해당 트랜잭션을 재시작 혹은 폐기
    • 마지막으로 수행한 커밋 명령 이후 수행한 모든 DML 명령어 작업들을 취소시켜 이전 상태로 원상 복귀

4.3 세이브포인트(save point)

  • 임시저장, 부분저장
  • 전체가 아닌 특정 부분에서 트랜잭션을 취소 위해 사용
  • 현재의 트랜잭션 작게 분할 가능
  • 여러 개의 SQL문의 실행을 수행하는 트랜잭션의 경우, 사용자가 트랜잭션 중간 단계에서 지정 가능
  • 취소 지점 명시 → 그 지점까지 작업 취소
  • 사용 방법
    • SAVEPOINT 세이브포인트명;
      → 세이브포인트 지정
    • ROLLBACK TO 세이브포인트명;
      → 해당 세이브포인트 지점까지 처리한 작업 롤백

5. 상태

5.1 활동(Active)

트랜잭션이 실행 중인 상태

5.2 실패(Failed)

트랜잭션 실행에 오류가 발생하여 중단된 상태

5.3 철회(Aborted)

트랜잭션이 비정상적으로 종료되어 롤백 연산을 수행한 상태

5.4 부분 완료(Partially Committed)

  • 트랜잭션의 마지막 연산까지 실행
  • 커밋 연산이 실행되기 직전의 상태

5.5 완료(Committed)

트랜잭션이 성공적으로 종료되어 커밋 연산을 실행한 후의 상태

6. 복구

6.1 REDO

  • UNDO로 취소했던 작업을 마음이 바뀌어 다시 되돌리는 작업
  • "취소를 취소"
  • 이미 커밋한 트랜잭션의 수정을 재반영하는 복구 작업
  • 사용자가 했던 작업을 그대로 다시 복구

6.2 UNDO

  • 컴퓨터로 무언가를 작업할 때 마음에 들지 않아 조금 전으로 되돌리고 싶을 때 행하는 작업
  • "방금 전에 했던 일을 취소"
  • 아직 완료되지 않은 트랜잭션이 수정한 페이지들도 디스크에 출력될 수 있으므로, 해당 트랜잭션이 어떤 이유든 정상적으로 종료될 수 없게 되면 트랜잭션이 변경한 페이지들은 원상 복구 되어야 함
  • 사용자가 했던 작업을 반대(원상태)로 복구
  • 무효화

6.3 비교

UndoRedo
기록 내용되돌리기 위한 변화재생하기 위한 변화
용도- 롤백
- 읽기 일관성
- 플래쉬 백
복구
저장소언두 세그먼트리두 로그 파일
기능멀티 유저의 읽기 일관성 보호데이터 손실 방지

6.4 방법

✅ 트랜잭션 철회

시스템은 정상적으로 동작하고 있으며, 특정 트랜잭션만 철회하는 경우

  1. 로그를 역방향 탐색하면서 해당 트랜잭션의 UNDO 복구가 필요한 로그를 찾아 이에 해당하는 UNDO 연산 수행
  2. UNDO 작업에 대한 REDO 전용 로그 기록
  3. 이전 로그 계속 탐색하면서 해당 트랜잭션의 시작 로그까지 도달

✅ 재시작 복구(restart recovery)

장애 발생 이후 데이터베이스 시스템이 재시작 복구 하는 경우

  1. 로그 분석 단계
    마지막 체크포인트 시점부터 최근 로그까지 로그를 탐색하면서 시스템 복구 시작 지점, 복구해야할 트랜잭션 등을 알아냄
  2. REDO 복구 단계
    복구 시작 시점부터 장애 발생 직전 시점까지 REDO가 필요한 모든 로그를 REDO 복구
  3. UNDO 복구 단계
    로그를 최신 시점부터 다시 역방향으로 탐색하면서 UNDO 복구가 필요한 로그들에 대해 UNDO 복구 수행
    → 여러 트랜잭션 철회(Global UNDO)



📖 참고

profile
기쁘게 코딩하고 싶은 백엔드 개발자

0개의 댓글