데이터베이스에서의 일의 단위
흔한 예시: 계좌 이체
UPDATE CUSTOMER
SET BALANCE=BALANCE - 100000
WHERE CUST_NAME="이정훈"
UPDATE CUSTOMER
SET BALANCE=BALANCE + 100000
WHERE CUST_NAME="윤지민"
위에서 순서는 중요하지 않다 그러나 모두 다 실행되거나 모두 다 실행되지 말아야 한다.
일부만 실행되는 것은 옳은 작동이 아니다.
이를 위해 하나의 트랜잭션(단위)로 DBMS가 처리하도록 보장해야 한다.
한 트랜잭션 내의 모든 연산들이 완전히 수행되거나 전혀 수행되지 않아야 한다.
DBMS의 회복 모듈이 부분적으로 데이터베이스를 갱신한 트랜잭션의 영향을 취소하여 원자성을 보장한다.
어떤 트랜잭션이 수행되기 전에 데이터베이스가 일관된 상태를 가졌다면 트랜잭션이 수행된 후에 데이터베이스는 또 다른 일관된 상태를 가져야 한다.
한 트랜잭션이 데이터를 갱신하는 동안 이 트랜잭션이 완료되기전에는 갱신 중인 데이터를 다른 트랜잭션들이 접근하지 못하도록 해야 한다.
다수의 트랜잭션들이 동시에 수행되더라도 그 결과는 어떤 순서에 따라 트랜잭션들을 하나씩 차례대로 수행한 결과와 같아야 한다.
DBMS의 동시성 제어 모듈이 트랜잭션의 독립성을 보장한다.
한 트랜잭션이 완료되면 이 트랜잭션이 갱신한 것은 그 후에 시스템이 고장이 발생해도 손실되지 않아야 한다.
완료된 트랜잭션은 시스템이 고장이 난 경우에도 데이터베이스에 반영된다.
트랜잭션에서 반영하려는 내용이 데이터베이스에 완전하게 반영된다.
SQL 구문상으로는 COMMIT이다.
트랜잭션에서 변경하려는 내용이 데이터베이스에 일부만 반영된 경우에는 원자성을 보장하기 위해서, 트랜잭션이 갱신한 사항을 트랜잭션이 수행되기 전의 상태로 되돌린다.
SQL 구문상으로는 ROLLBACK이다.
단지 메모리 버퍼에만 영향을 받았기 때문에 데이터의 변경 이전 상태로 복구 가능
현재 사용자는 SELECT 문장으로 변경된 결과를 확인 가능
다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없음
변경된 행은 locking이 설정되어서 다른 사용자가 변경할 수 없음
데이터에 대한 변경 사항이 데이터베이스에 반영됨
이전 데이터는 영원히 잃어버리게 됨
모든 사용자는 결과를 볼 수 있음
관련된 행은 locking이 풀리고, 다른 사용자들이 행을 조작 가능
데이터에 대한 변경 사항이 취소됨
이전 데이터는 다시 재저장됨
관련된 행은 locking이 풀리고, 다른 사용자들이 행을 조작 가능
데이터에 대한 무결성 보장
영구적인 변경을 하기 전에 데이터의 변경 사항 확인가능
논리적으로 연관된 작업을 그룹핑하여 처리 가능
동시에 수행되는 트랜잭션들이 데이터베이스에 미치는 영향은 이들을 순차적으로 수행하였을 때 데이터베이스에 미치는 영향과 같도록 보장해야 한다.
동시성 제어는 다수의 사용자가 데이터베이스를 동시에 접근하도록 허용하면서 데이터베이스의 일관성을 유지하게 해준다.
또한, 여러 사용자나 여러 응용 프로그램들이 동시에 수행되어도 서로 간섭하지 못하도록 보장한다.
여러 트랜잭션들의 집합을 한 번에 한 트랜잭션씩 차례대로 수행함
여러 트랜잭션들을 동시에 수행함
비직렬 스케줄의 결과가 어떤 직렬 스케줄의 수행 결과와 동등함.
갱신 손실
수행 중인 트랜잭션이 갱신한 내용을 다른 트랜잭션이 덮어씀으로써 갱신이 무효가 되는 것
오손 데이터 읽기
완료되지 않는 트랜잭션이 갱신한 데이터를 읽는 것
반복할 수 없는 읽기
한 트랜잭션이 동일한 데이터를 두 번 읽을 때 서로 다른 값을 읽음
모순성
같은 데이터 항목을 다른 트랜잭션이 동시에 접근할 때 잘못된 연산 결과가 발생함.
트랙잭션이 읽거나 갱신한 데이터에 대해 트랜잭션이 실행을 시작하기전에 시간표(Time Stamp)를 부여
부여된 시간에 따라 트랜잭션 작업을 수항해난 기법으로 교착상태가 발생하지 않음
데이터 항목을 로킹하는 개념은 동시에 수행되는 트랜잭션들의 동시성을 제어하기 위해서 가장 널리 사용되는 기법
락(lock)은 데이터베이스 내의 각 데이터 항목과 연관된 하나의 변수
일반적으로 데이터베이스 내의 모든 데이터 항목마다 락이 존재
각 트랜잭션이 수행을 시작하여 데이터 항목을 접근할 때마다 락에 관한 정보는 락 테이블(Lock Table)등에 유지
트랜잭션이 데이터 항목에 대한 접근을 끝낸 후에 락을 해제
트랜잭션에서 갱신을 목적으로 데이터 항목을 접근할 때는 독점 락(X-Lockm Exclusive Lock)을 요청
트랜잭션에서 읽을 목적으로 데이터 항목을 접근할 때는 공유 락(S-Lock, Shared Lock)을 요청
DBMS는 각 트랜잭션의 연산별로 적당한 수준의 락을 자동으로 설정
DBMS마다 LOCK 구현 방식과 세부 메커니즘이 다름

락을 요청하는 것과 락을 해제하는 것이 2단계로 이루어진다.
락 확장 단계가 지난 후에 락 수축 단계에 들어간다.
일단 락을 하나라도 해제하면 락 수축 단계에 들어간다.
락 확장 단계에서는 트랜잭션이 데이터 항목에 대하여 새로운 락을 요청할 수 있지만 보유하고 있던 락 하나라도 해제할 수 없음
락 수축 단계에서는 보유하고 있던 락을 해제할 수 있지만 새로운 락을 요청할 수 없음
락 수축 단계에서는 락을 조금씩 해제할 수 있고 트랜잭션이 완료 시점에 이르면 한꺼번에 모든 락을 해제할 수 있음
일반적으로 한번에 모든 락을 해제하는 방식이 사용됨
한 트랜잭션에서 필요로 하는 모든 락을 걸어놓은 시점
두 개 이상의 트랜잭션들이 서로 상대방이 보유하고 있는 락을 요청하면서 기다리고 있는 상태이다.
데드락을 해결하기 위해 데드락을 방지하는 기법, 데드락을 탐지하고 희생자를 선정하여 데드락을 푸는 기법등이 있다.
대부분의 트랜잭션들이 소수의 튜플들을 접근하는 데이터베이스 응용에서는 튜플 단위로 락을 해도 락 테이블을 다루는 시간이 오래 걸리지 않는다.
트랜잭션들이 많은 튜플을 접근하는 데이터베이스 응용에서 튜플 단위로만 락을 한다면 락 테이블에서 락 충돌을 검사하고, 락 정보를 기록하는 시간이 오래 걸린다.
트랜잭션이 접근하는 튜플의 수에 따라 락을 하는 데이터 항목의 단위를 구분하는 것이 필요하다.
데이터베이스에서 락을 할 수 있는 단위로는 데이터베이스, 릴레이션, 디스크 블록, 튜플 등이 있다.
일반적으로 DBMS는 각 트랜잭션에서 접근하는 튜플 수에 따라 자동적으로 락 단위를 조정한다.
데이터베이스를 갱신하는 도중에 시스템이 고장 나도 데이터베이스의 일관성을 유지한다.