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