대개, 데이터베이스 서버는 복수의 사용자가 사용하는 것이기 때문에 여러 명의 사용자가 같은 테이블에 있는 같은 데이터행을 동시에 변경할 수 있다.
이때, 데이터는 나중에 변경된 정보로 바뀌는데, 데이터베이스 서버는 데이터에 모순이 생기지
않도록 사용자가 변경중인 데이터에 잠금 설정을 해서 다른 사용자는 이 데이터에 변경할 수
없도록 한다.
이와 같은 서버의 기능을 『배타적 제어』라고 말한다.
배타적 제어는 데이터베이스 서버의 내부적인 기능이기 때문에 서버에 따라 각각의 특징이 있다.
여기에서는 SQL Server의 페이지 단위 잠금의 배타적 제어에 관하여 설명한다.
표 2-13 SQL Server의 배타적 제어
그러면, 순서에 따라 살펴보자.
① 사용자 A에서 트랜잭션을 시작한다.
② 사용자 B에서도 트랜잭션을 시작한다.
③ 사용자 A가 테이블 foo의 i=2의 행을 UPDATE한다. 이 처리는 아무 이상없이 종료한다.
④ 사용자 B에서도 i=2의 행을 UPDATE 한다.
⑤ 사용자 A가 데이터행을 변경 중이고, 또한 트랜잭션이 확정되어 있지 않은 상태이므로 사용자
B의 명령은 보류상태가 된다.
⑥ 사용자 A가 COMMIT를 실행하여 트랜잭션이 확정된다.
⑦ 보류되어 있던 사용자 B의 UPDATE 명령이 재개된다. 이때에는 사용자 B에 의해 잠금 상태가 된다.
⑧ 트랜잭션이 확정된다.
SQL Server에서는 잠금을 『페이지』라고 불리는 8KB의 단위로 실행한다.
위의 예에서는 『i=0, i=1, i=2』의 행이 같은 페이지에 들어있다고 가정하고 있다.
따라서, 직접 변경 대상이 아닌 행에 대해서도 잠금이 걸린다. 사용자 B가 『UPDATE foo
SET j=2 WHERE i=0』이라고 하더라도 트랜잭션이 종료할 때까지 보류상태가 계속된다.
또한 잠금 상태에서는 페이지를 참조하는 것과 같은 SELECT 명령도 보류된다.
(TRANSACTION ISOLATION LEVEL READ UNCOMMITED을 설정하고,
더티리드(Dirty Lead)를 실행하여 보류상태를 피할 수 있다).
SQL Server Version 7.0 에서는 동적인 잠금 단위가 선택된다.
페이지 단위, 행 단위, 테이블 단위 중 가장 적절한 단위로 잠금 설정된다.
'커맨드 명령' 카테고리의 다른 글
2.3 데이터 정의 언어(DDL) (0) | 2018.11.09 |
---|---|
2.2.3 행 단위의 잠금 (0) | 2018.11.08 |
2.2.1 트랜잭션의 시작과 종료 (0) | 2018.11.07 |
2.2 트랜잭션 (Transaction) (0) | 2018.11.07 |
2.1.11 DELETE (0) | 2018.11.06 |