10. 회복과 병행 제어
트랜잭션이란?
- 논리적인 작업의 단위. SQL의 모음
- 데이터베이스의 무결성과 일관성을 보장한다.
- 특성
- ACID
- 원자성(Atomic)
- all or nothing
- 트랜잭션을 구성하는 연산들이 모두 정상적으로 실행되거나 실행되지 않아야 함을 의미
- 일부만 연산이 처리되는 경우가 발생되면 안된다.
- 원자성을 보장하기 위해서는 회복기능이 필요하다.
- 일관성(Consistency)
- 트랜잭션이 끝난 이후에도 데이터베이스는 일관성을 유지해야 함을 의미한다.
- 모든 데이터는 규칙에 맞는 일관성을 유지해야 한다.
- ex) 철수가 10000원을 가지고 영희는 0원을 가지고 있을 때 -> 철수가 영희에게 5000원을 줘도 둘의 돈의 합계는 10000원이다. == 일관성
- 격리성(Isolation)
- 한 트랜잭션의 중간 연산 결과에 다른 트랜잭션이 끼어들면 안된다.(접근이 불가능하다)
- 실제로는 트랜잭션이 병렬적으로 처리가 이루어지지만 사용자는 동시에 트랜잭션이 완료되었다고 생각하게 된다.
- 지속성(Durability)
- 트랜잭션이 끝난 후 데이터베이스에 반영된 결과는 영구적이어야 한다.
- 연산
- commit
- 해당 연산을 통해 데이터베이스에 변경사항을 반영한다.
- 트랜잭션의 수행이 성공적으로 완료되었음을 알린다.
- rollback
- 트랜잭션의 수행이 실패하였음을 알린다.
- 지금까지 수행한 연산의 결과가 모두 취소되고 트랜잭션이 수행되기 전 상태로 복구한다.
- 상태
- 활동상태
- 부분완료 상태(마지막 연산 처리 후 + Commit 전) / 실패 상태 > 장애 발생 시
- 완료 상태(Commit 후) / 철회 상태(Rollback 후) > 하드웨어 결함이나 SW 오류일 경우에는 트랜잭션이 재 실행, 트랜잭션의 논리적 오류일 경우에는 트랜잭션이 폐기된다.
회복 기법
- 덤프 : 주기적으로 데이터베이스의 전체를 다른 장소에 복사하는 것
- 로그 : 데이터베이스의 변경연산이 발생할 때마다 데이터 변경 이전값과 이후값을 별도의 파일에 기록하는 방법. 데이터 손실이 발생되지 않는 저장장치에 저장
- 연산
- undo
- 변경상태를 모두 취소하여 데이터베이스를 원래 상태로 복구
- redo
- 로그 회복 기법
- 즉시 갱신 회복 기법
- 트랜잭션 수행 중에 데이터 변경 한 연산의 결과를 데이터베이스에 즉시 반영한다.
- 로그를 바탕으로 데이터베이스를 복구시킨다.
- 데이터베이스에 연산을 날리기 전에 로그부터 기록한다.
- undo 연산 : Commit 연산이 발생하지 않았을 경우
- redo 연산 : Commit 연산 발생 후
- 지연 갱신 회복 기법
- 부분완료 전까지 로그에만 기록했다가 부분완료 시 한번에 데이터베이스에 반영한다.
- undo 연산이 필요가 없으므로 연산 전의 값을 저장할 필요가 없다.
- 검사 시점 회복 기법
- 검사시점(Checkpoint)를 생성하여 장애 발생 시 가장 최근의 검사시점으로 돌아가 그 이후부터 회복작업을 시작한다.
병행 제어
- 여러 트랜잭션이 같은 데이터에 접근하더라도 정확한 수행결과를 얻을 수 있도록 트랜잭션의 수행을 제어하는 것
- 인터리빙 : 여러 트랜잭션이 차례로 번갈아서 실행되는 방식
- 병행 수행의 문제
- 갱신 분실
- 하나의 트랜잭션의 연산 결과를 다른 트랜잭션이 덮어써 연산 결과가 무효화되는 것
- 모순성
- 트랜잭션이 끝나기 전에 다른 트랜잭션의 수행을 통해 데이터의 값이 변경될 경우 모순된 결과가 발생한다.
- 연쇄 복귀
- 트랜잭션 완료 전에 장애가 발생하여 rollback연산이 필요한 경우 해당 값을 가져가 변경연산을 실행한 다른 트랜잭션에도 rollback 연산이 필요하다.
- 만약 해당 트랜잭션이 연산을 완료한 경우 rollback 연산이 불가능해진다.
트랜잭션 스케줄이란?
- 트랜잭션의 각 연산을 실행하는 순서
- 직렬 스케줄
- 각 트랜잭션 별로 연산을 순차적으로 실행시키는 것
- 인터리빙 방식을 이용X
- 각 트랜잭션이 독립적으로 수행된다.
- 항상 정확한 결과가 도출된다.
- 병행 수행이라고 할 수 없다.
- 비직렬 스케줄
- 인터리빙 방식을 활용해서 트랜잭션을 병행해서 수행하는 방식
- 하나의 트랜잭션이 완료되기 전에 다른 트랜잭션이 실행될 수 있다.
- 정확한 결과가 나올지 확신할 수 없다.
- 직렬 가능 스케줄
- 비직렬 스케줄 중 정확한 결과를 도출해낼 수 있는 스케줄
- 인터리빙 방식을 활용하여 트랜잭션을 병행 수행할 수 있음에도 정확한 결과를 도출해낼 수 있다.
병행 제어 기법
- 직렬 가능성을 보장받기 위해 사용하는 기법
- 로킹기법
- lock, unlock 연산을 활용
- lock : 데이터의 독점권을 가지기 위함
- unlock : 독점권을 반납하기 위함
- 상호 배제를 통해 직렬 가능성을 보장
- 데이터베이스부터 속성까지 다양하게 로킹을 걸 수 있다.
- 로킹 단위가 작아질 수록 제어가 어렵지만 병행성은 높아진다.
- 공용 lock
- 해당 데이터에 read연산이 가능. write 연산은 불가능함. 다른 트랜잭션도 해당 데이터에 lock을 걸 수 있음 -> 데이터에 대한 사용권을 여러 트랜잭션이 가질 수 있음
- 전용 lock
- 해당 데이터에 read,write연산 모두 가능. 다른 트랜잭션은 해당 데이터에 lock을 걸 수 없음 -> lock을 건 트랜잭션만 독점권을 가짐
- 2단계 로킹규약
- 확장단계 : lock만 걸 수 있고 unlock연산은 실행 불가능한 단계
- 축소단계 : unlock만 걸 수 있고 lock연산은 실행 불가능한 단계
- 트랜잭션 시작 시 확장단계부터 시작하며 데이터에 대한 모든 lock이 발생되지 않는 경우 다른 트랜잭션이 lock을 걸 수 없다.
- 교착상태(deadlock)
- 상대가 독점하고 있는 데이터에 unlock연산이 실행되기를 바라면서 기다리는 상태