동시성 제어 기법으로 잠금 기법이 있다. DBMS 대부분이 잠금 기법을 사용한다.
우선 동시성 제어와 필요성을 알아보자.
데이터베이스 시스템은 다중 사용자 환경을 지원한다. 트랜잭션이 동시에 실행되는 경우 트랜잭션 간섭으로 문제가 발생할 수 있다. 이를 막기 위해 트랜잭션 실행 순서를 제어하는 기법이다.
트랜잭션 : 데이터베이스 논리적 작업 단위
다중사용자 DBMS는 다중 프로그래밍 개념을 이용한다. 그래 트랜잭션 실행 중 다른 트랜잭션이 끼어들어 실행될 수 있다. 이때 동시에 실행되는 트랜잭션 간섭으로 인해 다음과 같은 문제들이 발생한다.
트랜잭션들이 동일한 데이터를 동시에 갱신하는 경우 발생한다.
또는 이전 트랜잭션이 데이터를 갱신한 후 종료하기 전 나중 트랜잭션이 동일한 데이터를 갱신하여 갱신 값을 덮어쓰는 경우에도 발생한다.
다수의 트랜잭션이 데이터를 공유할 때, 특정 트랜잭션이 이전 상태로 복귀(rollback) 할 경우 정상 트랜잭션까지 연달아 복귀하는 문제. 이때 한 트랜잭션이 이미 완료되었다면 트랜잭션 지속성 조건 에 따라 "복귀 불가능"하다.
지속성 : 트랜잭션이 성공적이면 그 트랜잭션이 갱신한 데이터베이스 내용은 영구적으로 저장되어야 한다.
다수의 트랜잭션이 동시에 실행할 때 간섭으로 인해 일관성이 유지되지 못하는 상황
일관성 : 트랜잭션이 실행되기 전,후 데이터베이스 내용은 일관되게 유지되어야 한다.
동시성 제어는 이러한 문제들을 방지한다. 또한 데이터 무결성과 일관성을 보장한다. 그래서 다중사용자 DBMS에서 중요하다.
데이터 무결성 : 데이터 결점이 없는 상황. 데이터베이스 내 데이터가 얼마나 정확한지를 의미한다.
직렬 스케줄로 만들거나 직렬 가능한 스케줄로 만든다. 그런데 직렬 스케줄은 끼어들기를 허용하지 않고 순차적으로 실행한다. 그래서 다중 프로그래밍 환경에서 좋은 방법이 아니다.
다중사용자 DBMS에서는 동시성(병행 수행)을 최대한 보장하며 직렬 스케줄과 동일한 결과를 얻을 수 있어야 한다. 그래서 직렬 가능한 스케줄로 만드는 것이 가장 좋은 방법이다.
"잠금(Locking)"은 트랜잭션 실행 순서를 강제로 제어한다. 이를 통해 직렬 가능한 스케줄이 되도록 보장한다.
이제 잠금 기법에 대해 알아보자.
잠금은 트랜잭션이 실행하는 동안 특정 데이터 항목에 대해서 다른 트랜잭션이 동시에 접근하지 못하도록 한다. 이를 상호배제 기능이라고 한다. 하나의 트랜잭션이 데이터 항목에 대해 잠금을 설정한다. 그러면 잠금을 설정한 트랜잭션이 해제 할 때까지 데이터를 독점적으로 사용한다.
잠금 기법은 lock 연산 과 unlock 연산을 사용한다.

잠금 연산은 공유잠금 과 배타잠금으로 나눈다. 이는 데이터 연산 성격에 따라 구분된다. 모든 트랜잭션은 데이터에 접근할 때 둘 중 하나의 잠금 방법을 사용한다. 공유잠금과 배타잠금 모두 잠금을 해제할 경우 unlock 연산을 이용한다.
• 배타잠금을 설정한 트랜잭션은 데이터 항목에 대해서 읽기 연산(read)과 쓰기 연산(write) 모두 가능하다.
ex) T1에서 x에 대해 S-lock을 설정했다면, T1은 read(x) 연산과 write(x) 연산 모두 가능하다.
• 하나의 데이터 항목에 대해서는 하나의 배타잠금(X-lock)만 가능하다.
- 동시에 여러 개의 배타잠금은 불가능하다.
ex) T1에서 x에 대해 X-lock을 설정했다면, T1에서 unlock(x)를 하기 전까지 T2에서 x에 대해 X-lock을 설정할 수 없다.
• 다른 트랜잭션은 읽기 연산(read)와 쓰기 연산(write) 모두 불가능하다.
ex) T1에서 x에 대해 X-lock을 설정했다면, T2에서는 T1에서 unlock(x)를 하기 전까지 read(x), write(x) 연산이 모두 불가능하다.