데이터베이스에 대한 연산 (검색, 삽입, 삭제, 수정) 필요로 함
* 트랜잭션
: 하나의 논리적인 작업단위를 구성하는 연산들의 집합
1) 성공적인 상태 (all)
2) 빠져나가기 전 상태 (nothing)
데이터베이스 응용 프로그램 : 트랜잭션들의 집합
* 트랜잭션이 지켜야 할 조건 : ACID특성
1) 원자성: 중간에 멈출 수 없음 (all or nothing)
2) 일관성: 트랜잭션이 시작전에 데이터베이스 내용이 일관된 상태->트랜잭션 종료돼도 일관
3) 고립성: 실행하는 과정에서 완료될 때까진 다른 트랜잭션이 참고 x
순차적으로 해결 but,다중 프로그래밍 환경에서는 순차적으로 하면 문제o
상호 간섭이 일어나지 않도록 하는 기법
실행결과가 동일한지 비교해보기
4) 지속성: 성공적으로 완료되면 영구적으로 저장돼야 함
주기억장치가 아닌 보조기억장치에 저장 or
어떠한 형태로든지 데이터 복구 가능 해야 함(log)
* 트랜잭션의 상태
1. 동작(active)
트랜잭션이 시작되고 연산들이 정상적으로 실행중인 상태
2. 부분 완료(partially committed)
모든 연산의 실행은 끝났지만 지속성의 확보는 안된 상태
3. 완료(committed)
성공적으로 종료된 상태
4. 실패(failed)
완료되지 못하고 더이상 실행되지 못하는 상태
5. 중단(aborted)
실패한 후 실행되기 이전으로 복귀한 상태
* DBMS
1) 단일 사용자 DBMS
2) 다중 사용자 DBMS
CPU는 한 개지만 여러 사용자가 동시에 사용할 수 있는 이유 -> 다중프로그래밍
한 트랜잭션이 끝나기 전에 다른 트랜잭션이 수행될 수 있음
* 트랜잭션에서의 연산
read(x) : 이름이 x인 데이터베이스 항목을 트랜잭션의 지역변수 x로 읽어 들임
write(x) : 지역변수 x에 저장된 값을 데이터베이스 항목 x에 저장
* 주의 : write(x)연산 수행 시 결과가 디스크에 즉시 저장될 수도 있고 그렇지 않을 수도 있음
대부분의 DBMS에서는 주기억장치에 버퍼를 두고 디스크에 저장할 데이터 일시적 보관하였다가 나중에 블록 단위로 기록함
* 동시성 제어가 필요한 이유
: 동시에 실행되는 트랜잭션은 각각에 정의된 명령들이 끼어들기 방식으로 진행,
* 끼어들기 방식에 의해 실행되는 순서 : 스케줄
트랜잭션의 스케줄 : 운영체제의 권한이라 예측 불가능
* 문제점의 유형
1) 갱신분실 (lost update)
결과 독립적 저장해서 서로에게 영향을 미치지 못해 트랜잭션a의 결과 반영x
2) 연쇄복귀 (cascading rollback)
트랜잭션a는 아무런 잘못 없지만 트랜잭션b에 의해 실패하는 결과
: 완료되지 않은 트랜잭션의 쓰기 연산에 의해 갱신된 데이터를 다른 트랜잭션이 읽어서!
3) 불일치분석 (inconsistent analysis)
끼어들기로 인해 일관성이 유지되지 못하는 상황
* 직렬 스케줄 (serial schedule) : 트랜잭션을 순차적으로 실행시킨 것
but, 직렬 스케줄은 다중 프로그래밍의 장점을 포기해야 함
* 직렬 가능한 스케줄 (serializable schedule)
병행 수행(끼어들기)을 보장하면서 직렬스케줄로 실행한 것과 동일한 결과
1) c1,c2가 서로 다른 데이터 항목에 대한 연산일 경우 교환 가능함
2) c1,c2가 같은 데이터 항목에 대한 연산일 경우
i. c1,c2가 모두 read연산일 경우 ->o
ii. c1,c2에 하나라도 write연산일경우 ->x
* 직렬가능한 스케줄 보장을 위한 트랜잭션의 실행순서 제어
1) 잠금 (locking) : 강제 제어 , 대부분의 DBMS에서 사용
하나의 트랜잭션이 실행되는 동안 특정 데이터 항목에 대해서 다른 트랜잭션이 동시에 접근하지 못하도록 독점
unlock(x) 실행해야 다른 트랜잭션이 x에 대한 잠금 설정하고 사용가능
i. 공유잠금 (shared lock : S-lock) : read연산에 대한 lock
S-lock(x) : 트랜잭션 T가 데이터항목 x에 대해 S-lock을 걸면, T는 x에 대해 read(x)연산을 할 수 있지만 write(x) 연산은 불가능
ii. 배타잠금 (exclusive lock : X-lock) : write연산에 대한 lock
X-lock(x) : 트랜잭션 T가 데이터항목 x에 대해 X-lock을 걸면, T는 x에 대해 read(x), write(x) 연산 둘 다 가능
하나의 데이터에 대해 동시에 여러 개의 배타잠금은 불가
연산 끝나면 둘 다 unlock 실행해야 함
문제: 교착상태 (모두 대기상태 들어가서 진행 안되는 상태-> 외부 강제 중단)
해결 : 2단계 잠금규약 (2PL) ->직렬가능 (but, 직렬 가능하다고 2pl은 아님)
I. 확장단계 : lock 연산은 수행 가능, unlock은 수행 불가
II. 축소단계 : lock 연산은 수행 불가, unlock은 수행 가능
처음엔 lock 연산만 가능, 한번 unlock하면 그 다음부터는 unlock연산만 가능
문제1 :교착상태
해결: 교착상태 회피 (미리 lock 다 걸기)
문제2 : 연쇄복귀 문제 엄격한 2단계 잠금 규약 (모든 x-lock에 대한 unlock 연산을 트랜잭션이 완료된 후에 실행)
* 잠금단위
: 잠금의 대상이 되는 데이터 객체의 크기 (레코드 필드값~데이터베이스)
2) 타임스탬프 (timestamp) : 최대한 병행 수행 보장, 위배될 가능성 있으면 트랜잭션 실행 취소(roll back)
* 복구 (recovery)
: 장애 이전의 일관된 상태로 복원하는 과정
1) 트랜잭션 장애 : 소프트웨어적 오류(논리적 오류, 잘못된 데이터, 시스템 내 자원부족)
2) 시스템 장애 : 정전이나 하드웨어 결함, 이때 주기억장치 같은 휘발성 저장장치 내용 분실 or 손상
3) 미디어 장애 : 디스크와 같은 비휘발성 저장장치의 일부 또는 전체가 손상
->복구되는 원리 : 데이터의 중복
1. 백업파일을 만들어 보관 (dvd 나 자기테이프 같은 저장장치)
2. 다른 디스크(비 휘발성 장치)에 복제 : 완료된 이후에만 기록됨
* 로그 (log)
: 어떠한 순서로 갱신이 이루어졌는가를 나타내는 정보 기록
데이터베이스는 비휘발성 장치인 디스크에 상주, 블록이라는 고정 단위로 분할
즉, 데이터 항목이 저장된 블록을 주기억장치의 버퍼로 읽어 들이기
해당 블록이 이미 버퍼에 존재한다면 다시 읽지 않고 버퍼에서 읽으면 된다.
즉, 갱신된 블록들은 이후의 적당한 시기에 디스크로 저장된다.
* 로그에 저장되는 트랜잭션의 상태
1) 트랜잭션의 시작 <T start>
2) 트랜잭션의 완료 <T commit>
3) 트랜잭션의 중단 <T abort> // abort: 원래값
4) 데이터 항목에 대한 갱신 <T,x1,v1,v2> // x:데이터 항목 이름, v1:원래값, v2:변경될 값
* 로그 우선기록 규약
:레코드 기록시 가장 중요한 사항: 트랜잭션이 갱신한 데이터 항목을 데이터 베이스에 기록하기 전에 로그 레코드(디스크) 에 우선 기록해야 함
1. 성공적으로 복귀(roll back) 시킬 수 있음
2. 이미 완료된 트랜잭션에 대해서 데이터베이스 갱신내용을 디스크에 반영할 때 유용
* 복구 연산
1. UNDO연산 : 갱신된 값을 이전의 값으로 되돌려 놓음
2. REDO연산 : 반영이 안됐을 경우 재실행
* 복구 방법
1. 지연 갱신 : 트랜잭션의 실행이 성공적으로 완료될 때까지 갱신내용을 디스크에 저장하지 않고 지연시키는 방식
트랜잭션이 실행되는 동안 갱신된 내용이 주기억장치의 버퍼에 기록, 트랜잭션이 완료된 이후의 적당한 시점에 디스크에 저장
* 지연갱신에서의 트랜잭션 실행
i. <T start>
ii. 쓰기 연산을 수행하면 주기억장치의 버퍼에 변경된 값 저장
iii. 모든 연산에 대한 실행 마치면 T는 부분 완료 상태, <T commit>기록
// <T commit> 기록: 트랜잭션이 완료된 상태
iv. <T commit> ->T는 완료상태가 되어 종료
v. 버퍼에 저장된 X를 적당한 시기에 디스크에 저장
완료 이전에는 갱신된 내용 저장되지 않으므로 복구하는 UNDO 연산 필요 없음
완료되고 저장 안될 경우는 있으므로 REDO 연산만 수행
->NO UNDO/REDO 알고리즘
<T,x,v2> //T라는 트랜잭션이 x를 v2로 갱신
* 로그를 이용한 복구방법
i. 순차검색
ii. <T commit>이 저장되었으면 트랜잭션의 갱신기록에 대해 REDO연산 수행
iii. <T commit> 없으면 무시
2. 즉시 갱신 : 트랜잭션의 수행 도중에 언제든지 데이터의 갱신 내용이 디스크에 저장될 수 있음 ->UNDO/ REDO 알고리즘
* 로그를 이용한 복구방법
i. 마지막부터 반대방향으로 순차검색
ii. <T commit> 없으면 UNDO연산 실행
iii. 처음에 도달했으면 반대방향으로 순차실행
iv. <T commit> 저장되어 있으면 REDO연산 실행
3. 검사점(checkpoint)을 이용한 복구
* 검사점 ?
: 주기적으로 디스크에 갱신된 내용을 모두 디스크에 기록하는 시점
현재까지 로그에 기록된 내용과 디스크에 저장된 데이터베이스 내용을 일치시키는 과정
* 즉시갱신의 경우 가정,
1. 트랜잭션 실행 중단
2. 모든 버퍼의 내용을 디스크로 출력
3. 로그에 checkpoint라는 레코드 저장
4. 중단된 트랜잭션 다시 실행
장점: 검사점 이전에 완료된 트랜잭션에 대해서 UNDO나 REDO연산이 필요 없음
* 데이터베이스에 대한 연산
1. DML : select, insert, delete, update 등 테이블에 대한 읽기와 쓰기 연산으로 구성
->commit 종료, roll back
오라클에서는 프로그램 정상적 종료-> 트랜잭션 자동 완료,
비정상적 종료-> 자동으로 복귀
set autocommit on -> 자동으로 완료하는 명령
2. DDL : create table, drop table등 데이터 베이스 스키마의 변경에 관한 명령
3. DCL : grant, revoke 등 권한 관련 명령어
->DDL,DCL은 자동완료, 복귀 불가능
* 자동완료 되는 경우
1. 정상적 종료
2. DDL이나 DCL명령-> 자동 완료
3. set autocommit on 실행하면 개별 DML명령은 자동 완료됨
* 저장점
: 하나의 트랜잭션을 분할하여 트랜잭션의 일부만을 복귀
savepoint <저장점 이름>
rollback to <저장점 이름> //일반적 rollback은 트랜잭션 자체 취소지만, 저장점으로 복귀하는 rollback명령은 트랜잭션은 실행중 이지만, 저장점 위치 까지만 일부복귀 시키는 것
'개인공부 > db' 카테고리의 다른 글
추가개념 (0) | 2023.07.20 |
---|---|
8장 (물리적 저장 구조와 인덱스) (0) | 2023.07.20 |
7장 (함수적 종속과 정규화) (0) | 2023.07.20 |
6장 (데이터베이스 설계) (0) | 2023.07.20 |
5장 (무결성과 보안) (0) | 2023.07.20 |