하나의 작업을 수행하기 위해 필요한 데이터베이스 연산들을 모아놓은 것으로, 논리적인 작업의 단위
시스템이 제대로 동작하지 않는 상태다. 트랜잭션 장애, 시스템 장애, 미디어 장애가 있다.
장애가 발생했을 때 데이터베이스를 장애가 발생하가 전의 일관된 상태로 복구시키는 것이다. redo(재실행), undo(취소) 연산이 있다.
로그를 이용한 회복 기법으로, 즉시 갱신 회복과 지연 갱신 회복이 있다.
여러 개의 트랜잭션을 동시에 수행하는 것으로, 갱신 분실, 모순성, 연쇄 복귀의 문제가 있다.
병행 수행 시 문제가 발생하지 않고 정확한 결과를 얻을 수 있도록 트랜잭션의 수행을 제어하는 것이다.
인터리빙 방식을 이용하지 않고 각 트랜잭션별로 연산들을 순차적으로 실행시키는 것이다.
모든 트랜잭션이 다른 트랜잭션의 방해를 받지 않고 독립적으로 수행되기 때문에 항상 모순 없는 결과를 얻는다. 하지만 인터리빙, 트랜잭션들이 동시에 수행되는 병행 수행이 없기 때문에 일반적으로 사용하지 않는다.
인터리빙 방식을 이용하여 트랜잭션을 병행해서 수행시키는 것이다. 트랜잭션이 돌아가면서 연산들을 실행하기 때문에 하나의 트랜잭션이 완료되기 전에 다른 트랜잭션의 연산이 실행될 수 있다. 그렇기 때문에 갱신 분실, 모순성, 연쇄 복귀 등의 문제가 발생할 수 있어 최종 수행 결과의 정확성을 보장할 수 없다.
직렬 스케줄에 따라 수행한 것과 같이 정확한 결과를 생성하는 비직렬 스케줄이다. 모든 비직렬 스케줄이 직렬 가능한 것은 아니다. 비직렬 스케줄 중에서 수행 결과가 동일한 직렬 스케줄이 없는 것들은 결과의 정확성을 보장할 수 없으므로 직렬 가능 스케줄이 아니다.
직렬 가능 스케줄 여부를 판단하는 일은 쉽지 않다. 그래서 검사하기 보다는 직렬 가능성을 보장하는 병행 제어 기법을 사용한다.
여러 트랜잭션을 병행 수행하면서도 정확한 결과를 얻을 수 있는 직렬 가능성을 보장받기 위해 사용한다.
모든 트랜젹션이 따르면 직렬 가능성이 보장되는 나름의 규약을 정의하고, 트랜잭션들이 이 규약을 따르도록 하는 것이다. 그러면 해당 스케줄의 직렬 가능성을 보장할 수 있다.
가장 많이 사용되는 병행 제어 기법인 로킹기법에 대해 알아보자
한 트랜잭션이 먼저 접근한 데이터에 대한 연산을 모두 마칠 때까지, 해당 데이터에 다른 트랜잭션이 접근하지 못하도록 상호 배제하여 직렬 가능성을 보장하는 것이다.
트랜잭션이 사용할 데이터에 대한 독점권을 가지기 위해 사용한다.
트랜잭션이 데이터에 대한 독점권을 반납하기 위해 사용한다.
2단계 로킹 규약을 따르려면 모든 트랜잭션이 lock과 unlock연산을 다음과 같이 2단계로 나누어 실행해야 한다.
트랜잭션이 lock연산만 실행할 수 있고, unlock 연산은 실행할 수 없는 단계
트랜잭션이 unlock연산만 실행할 수 있고, lock 연산은 실행할 수 없는 단계
간단히 말하면 처음 lock만한다가 한번이라도 unlock하게 되면 계속 unlock만 해야됨
이를 통해 직렬 가능성을 보장할 수 있다. 하지만 교착상태가 발생할 수 있어 이에 대한 해결책이 필요하다.
트랜잭션들이 상대가 독점하고 있는 데이터에 unlock연산이 실행되기를 서로 기다리면서 트랜잭션의 수행을 중단하고 있는 상태다. 교착 상태에 빠지면 트랜잭션들은 더 이상 수행을 계속하지 못하고 상대 트랜잭션이 먼저 unlock 연산을 실행해주기를 한없이 기다리게 된다.
예를 들어 트랜잭션 T1과 T2가 모두 데이터 X와 데이터 Y에 접근하는 상황을 생각해보자. 트랜잭션T1이 T2가 lock한 데이터 X에 접근하기 위해 T2 unlock 연산을 실행해주기를 기다리고 있고 T2는 T1이 lock한 데이터 Y에 접근하기 위해 T1이 unlock연산을 실행해주기를 기다리고 있다면 교착상태가 된다.
교착 상태는 처음부터 발생하지 않도록 예방하거나, 발생했을 때 빨리 탐지하여 필요한 조치를 취하는 방법으로 해결한다.