1. 트랜잭션(transaction)의 정의
    1. 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 수행되어야 할 일련의 연산들
    2. 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위
    3. 사용자가 시스템에 대한 서비스 요구시 시스템이 응답하기 위한 상태 변환 과정의 작업단위
    4. 하나의 트랜잭션은 Commit 되거나 Rollback된다
  2. 트랜잭션의 특성
    1. 원자성(Atomicity)
      1. 트랜잭션의 연산은 완전히 수행되거나 전혀 수행되지 않아야 한다(all or nothing)
      2. 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어나 하나라도 오류가 발생하면 모두 취소되어야 한다
    2. 일관성(Consistency)
      1. 트랜잭션이 성공적으로 완료하면 일관성 잇는 데이터베이스 상태로 변환한다
      2. 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 수행 후의 상태가 같아야 한다
      3. 트랜잭션이 수행되는 도중에는 데이터베이스가 일시적으로 일관된 상태를 갖지 않을 수 있음
    3. 고립성(Isolation; 독립성)
      1. 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없다.
      2. 수행중인 트랜잭션은 오나전히 완료될때까지 다른 트랜잭션의 수행 결과를 참조할 수 없다.
    4. 지속성(Durability)
      1. 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어ㅇ야
  3. 트랜잭션의 상태
    1. 활동(Active) : 트랜잭션이 실행중인 상태
    2. 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
    3. 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback연산을 수행한 상태
    4. 부분완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태
    5. 완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit연산을 실행한 후의 상태
  4. 동시성 제어
    1. 동시성 이란
      1. 여러 사용자들이 동시에 동일한 테이블을 접근
      2. 여러 사용자의 질의나 프로그램들을 동시에 수행
    2. 동시성 제어란
      1. 여러 사용자들이 다수의 트랜잭션들을 동시에 수행하는 환경에서 부정확한 결과를 생성할 수 잇는 트랜잭션들 간의 간섭이 생기지 않도록 함
    3. 스케줄링 방법들
      1. 직렬 스케줄(serial schedule)
        1. 여러 트랜잭션들의 집합을 한 번에 한 트랜잭션씩 차례대로 수행
        2. 데이터베이스 일관성이 유지됨
      2. 비직렬 스케줄(non-serial schedule)
        1. 여러 트랜잭션들을 동시에 수행함
      3. 직렬가능(serializable)
        1. 비직렬 스케줄의 결과가 어떤 직렬 스케줄의 수행 결과와 동등함
    4. 동시성 제어를 하지 않을 경우에 생길 수 있는 문제
      1. 갱신 손실(lost update) : 수행 중인 트랜잭션이 갱신한 내용을 다른 트랜잭션이 덮어 씀으로써 갱신이 무효가 되는 것
      2. 오손 데이터 읽기(dirty read) : 완료되지 않은 트랜잭션이 갱신한 데이터를 읽는 것
      3. 반복할 수 없는 읽기(unrepeatable read) : 한 트랜잭션이 동일한 데이터를 두 번 읽을 때 서로 다른 값을 읽는 것
  5. 데이터베이스 연산
    1. Input(X) : 항목 X를 포함하고 있는 블록을 주기억장치의 버퍼로 읽어들임
    2. Output(X) : 항목 X를 포함하고 있는 블록을 디스크에 기록함
    3. read_item(X) : 주기억장치 버퍼에서 항목 X의 값을 읽어 변수 X로 복사함
    4. write_item(X) : 변수 X의 값을 주기억장치 내의 항목 X에 기록함
  6. 로킹(locking)
    1. 가장 널리 사용되는 동시성 제어 기법
    2. lock은 데이터베이스 내의 각 데이터 항목과 연관된 하나의 변수
    3. lock table 을 사용함
    4. 독점 로크(X-lock, eXclusive lock) : 트랜잭션이 갱신을 목적으로 접근할 때 요청
    5. 공유 로크(S-lock, Shared lock) : 트랜잭션이 읽을 목적으로 접근할 때 요청
    6. 해제(unlock) : 트랜잭션이 데이터 항목에 대한 접근을 끝낸 후 해제
  7. 2단계 로킹 프로토콜
    1. 1단계 로킹만으로도 일관성이 위배되는 경우 발생
    2. 2단계 로킹 프로토콜을 이용해서 해결
    3. 사용자는 원하는 SQL만 사용하면 됨
      1. 로킹 작업은 DBMS가 관리해주기 때문
  8. 데드록(deadlock)
    1. 2단계 로킹 프로토콜에서 데드록 발생 가능
    2. 두 개 이상의 트랜잭션들이 서로 상대방이 보유하고 있는 로크를 요청하면서 기다리고 있는 상태
  9. 다중 로크 단위(multiple granulaity)
    1. 로크할 수 있는 단위 : 데이터베이스, 릴레이션, 디스크 블록, 투플 등
    2. 로크 단위가 작을수록
      1. 로킹에 따른 오버헤드 증가
      2. 동시성 정도 증가
  10. 팬텀 문제(phantom problem) : 그림 9.16
    1. 연속된 두번의 Select 문의 결과가 다르게 나오는 이유
      1. 두 동작 사이에 릴레이션의 변화를 주면 없던 투플이 생기거나 있던 투플이 사라짐
  11. 회복(recovery)
    1. 개념
      1. 필요성 : 트랜잭션 T를 수행하는 도중 시스템 다운
        1. 일부만 시스템에 반영된 경우
        2. T의 갱신효과가 주기억 장치로부터 디스크에 기록되지 않았을 경우
      2. 해결
        1. 재수행(ReDo)
        2. 취소(UnDo)
      3. 재해적 고장/비재해적 고장
        1. 재해적 고장
          1. 디스크 손상 – 백업본으로 회복
        2. 비재해적 고장
          1. 로그를 기반으로한 즉시 갱신
    2. 로그
      1. 개념
        1. 데이터베이스의 항목에 영향을 미치는 모든 트랜잭션의 연산들에 대해서 로그 레코드 기록
        2. 각 로그 레코드는 로그 순서 번호(LSN; Log Sequence Number)로 식별됨
        3. 로그는 데이터베이스 회복에 필수적이므로 일반적으로 안전 저장 장치에 저장됨
        4. 이중 로그(dual logging) : 로그를 두 개의 디스크에 중복해서 저장
        5. 동일한 트랜잭션에 속하는 로그 레코드들은 연결 리스트로 유지됨
      2. 로그 레코드의 유형
        1. [Trans-ID, start]
        2. [Trans-ID, X, old_value, new_value]
        3. [Trans-ID, commit]
        4. [Trans-ID, abort]
    3. 트랜잭션의 완료점(commit point)
      1. 한 트랜잭션의 데이터베이스 갱신 연산아 모두 끝나고 데이터베이스 갱신 사항이 로그에 기록되었을 때
      2. 회복모듈 : 로그를 검사하여 로그 중 [Trans-ID, start]와 [Trans-ID, commit] 사이의 모든 트랜잭션을 재수행
      3. [Trans-ID, start]는 있지만 [Trans-ID, commit] 가 없으면 트랜잭션은 취소
    4. 로그 먼저 쓰기(WAL; Write-Ahead Logging)
      1. 데이터베이스 버퍼보다 로그 버퍼를 먼저 디스크에 기록해야 함
    5. 체크포인트(checkpoint)
      1. 체크포인트 시점에 주기억 장치의 버퍼 내용이 디스크에 강제로 기록
      2. -> 디스크 상에서 로그와 데이터베이스의 내용이 일치
      3. 체크포인트 작업 후 로그에 [checkpoint] 로그 레코드 기록
      4. 일반적으로 체크포인트를 10~20분마다 수행
      5. 수행 작업
        1. 수행중인 트랜잭션 일시 중지
        2. 주기억 장치의 로그 버퍼를 디스크에 강제로 출력
        3. 주기억 장치의 데이터베이스 버퍼를 디스크에 강제 출력
        4. [checkpoint] 로그 레코드를 로그 버퍼에 기록 후 디스크에 강제 출력
        5. 체크포인트 시점에 수행중이던 트랜잭션 ID도 로그레코드에 기록
        6. 일시 중지된 트랜잭션 재개
    6. 재해적 고장으로부터의 회복
      1. – 자기 테이브를 이용한 백업
      2. 점진적인 백업(incremental backup)이 바람직
  12. PL/SQL의 트랜잭션
    1. 묵시적(암시적) 또는 명시적으로 끝날 수 있음
    2. Sql Developer를 정상적으로 종료했을 때는 트랜잭션이 묵시적으로 commit됨
    3. commit : 현재의 트랜잭션에서 수행한 결과를 데이터베이스에 모두 반영하고 현재의 트랜잭션 완료
    4. rollback : 현재의 트랜잭션에서 수행한 결과를 데이터베이스에서 모두 되돌리고 현재의 트랜잭션 철회
    5. savepoint : 현재의 트랜잭션 내의 저장점을 표시하여 트랜잭션을 더 작은 부분으로 나눔
    6. rollback to savepoint : 현재의 트랜잭션에서 지정된 저장점 이후에 갱신된 내용만 되돌림
error: Content is protected !!