[DB] 트랜잭션(Transaction)

이름이름·2022년 12월 7일
0

DB

목록 보기
4/7

트랜잭션(Transaction)

트랜잭션이란 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위를 말한다.
데이터베이스의 상태를 변화시킨다는 의미는 SQL문을 통해 데이터베이스에 접근하는 것을 의미한다
작업의 단위는 sql문 한 문장이 아니고 여러 문장이 합쳐진것이다
예를 들어 내가 게시글을 올리면 DB에 insert가 되고 다시 select를 해서 보여줘야한다
이런 작업단위를 하나의 트랜잭션이라고 한다

트랜잭션의 특징(ACID)

원자성(Atomicity)

하나의 원자마냥 All or nothing 즉, 중간에 하다 마는 경우는 없다는 말
-> 다 반영되거나 아예 반영안하거나

일관성(Consistency)

트랜잭션을 수행하기 전이나 수행한 후나 데이터베이스는 항상 일관된 상태를 유지해야 한다

고립성(Isolation)

수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경 중인 데이터 값을 훼손하는 일이 없어야 한다

지속성(Durability)

수행을 성공적으로 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야 한다.

Schedule

스케줄이란 (여러) 트랜젝션에 의해 수행되는 모든 명령어들을 시간 순으로 나열한 것

Serializability

트랜젝션은 프로그램이기 때문에, 트랜젝션이 어떤 연산을 수행하고, 상호 통신을 어떻게 하는지 알기는 어려움.

스케줄러의 입장에서 주되게 보는 함수는 read(Q)와 write(Q)임

read와 write만 보기 때문에 상황의 경우의 수는 4가지가 나온다

  1. I = read(Q), J = read(Q)
    이 경우, I와 J의 순서는 중요하지 않다.
    왜냐하면 동일한 값이 Ti와 Tj에 의해 읽히기 때문이다.

  2. I = read(Q), J = write(Q)

    I가 J 이전 -> Ti는 Tj에 의해 작성된 값을 읽을 수 없음
    I가 J 뒤에 -> Ti는 Tj가 작성한 값을 읽음
    따라서 순서가 중요해 진다.

  3. I = write(Q), J = read(Q)

    이는 바로 직전인 2번 I,J를 바꾼 동일한 경우이다.

  4. I = write(Q), J = write(Q)

    둘다 write이기 때문에 이는 상호에게 영향을 끼치지 않는다.
    그렇지만 다음 누군가에 의한 read(Q)에 영향을 끼친다.

Equivalent

우리는 서로 다른 트랜젝션이 동일한 데이터로의 연산자가 있으면서 두 명령어 중 하나가 write일 때 명령어 I와 J가 conflict하다고 한다.

만약 I와 J가 서로 다른 트랜젝션의 명령어이면서 서로 conflict하지 않는다면, 우리는 이 둘의 순서를 바꿔서 새로운 스케줄 S'을 만들 수 있음. 이 때 S는 S'과 동일(equivalent)하다고 한다.

Commit(완료)

트랜잭션이 성공적으로 실행되면 commit을 명령해 영구적인 갱신을 한다

Rollback(복귀)

트랜잭션실행이 실패하면 수행한 모든 연산 결과를 undo한다

Redo & Undo

Redo

트랜잭션 로그를 이용하여 오류가 발생한 트랜잭션을 재실행하여 복구 수행

데이터베이스 내용 자체가 손상이 된 경우에 가장 최근의 복제본을 적재시킨 뒤, 이 복제본 이후에 일어난 변경만 로그를 이용하여 재실행함으로써 데이터베이스를 복원하는 것 -> 이를통해 트랜잭션의 영속성 제공

Undo

트랜잭션 로그를 이용하여 오류와 관련된 모든 변경을 취소하여 복구 수행

만약 해당 트랜잭션이 어떤 이유든 정상적으로 종료될 수 없게 되면 즉, 데이터베이스 내용 자체가 손상되지는 않았지만 변경중이거나 변경된 애용에 대한 신뢰성을 잃어버린 경우에 로그를 이용하여 모든 변경들을 취소시킴으로써 원래 데이터베이스를 복원하는 것 -> 이를통해 트랜잭션 원자성 제공

즉시 갱신 (Redo,Undo 둘 다)

트랜잭션 수행 도중 데이터를 변경하면 변경 정보를 로그 파일에 저장하고, 트랜잭션이 부분 완료되기 전이라도 모든 변경 내용을 즉시 데이터베이스에 반영하는 기법


<Ti, Start>만 있고 <Ti, Commit>이 없음 = UNDO(Ti)
<Ti, Start>, <Ti, Commit> 둘다 있음 = REDO(Ti)

  • <상황 1> : T1이 먼저 실행돼서 commit까지 하고 T2는 그 다음에 진행하다가 commit하기 전에 실패한 상황
    -> T2를 먼저 Undo하고 T1을 Redo함 (일반적으로 모든 Undo후에 Redo를 함)
  • <상황 2> : T1과 T2 모두 commit까지 완료된 후에 시스템 붕괴
    -> 먼저 실행됐던 T1먼저 Redo후에 T2를 Redo함

지연 갱신 (Redo만)

트랜잭션이 부분 완료 상태에 이르기까지 발생한 모든 변경 내용을 로그 파일에만 저장하고, 데이터베이스에는 Commit이 발생할 때까지 저장을 지연하는 기법

  • 부분 완료될 때까지 모든 Output 연산(버퍼 블록을 디스크로 이동)을 지연하고 변경은 로그에 기록한다

Redo는 <Ti, Start>와 <Ti, Commit> 로그 레코드가 모두 있는 트랜잭션에 대해서만 해야한다

profile
공부 정리

0개의 댓글