CS/DB

[DB] 동시성 제어

겜도리도리 2022. 6. 14. 23:57
반응형

개요

대부분의 DBMS들은 다수 사용자용이기 때문에, 여러 사용자들이 동시에 동일한 테이블을 접근하기도 한다.

DBMS의 성능을 높이기 위해서는 여러 사용자의 질의나 프로그램들을 동시에 수행하는 것이 필수적이다.

동시성 제어 기법은 여러 사용자들이 다수의 트랜잭션들을 동시에 수행하는 환경에서 부정확한 결과를 생성할 수 있는, 트랜잭션들 간의 간섭이 생기지 않도록 한다.

 

종류

직렬 스케줄(Serial schedule)

여러 트랜잭션들의 집합을 한 번에 한 트랜잭션씩 차례대로 수행한다.

 

비직렬 스케줄(Non-serial schedule)

여러 트랜잭션들을 동시에 수행한다.

 

직렬 가능(Serializable)

비직렬 스케줄의 결과가 어떤 직렬 스케줄의 수행 결과와 동등할 때를 말한다.

 

데이터베이스 연산

Input(X)

데이터베이스 항목 X를 포함하고 있는 블록을 주기억장치의 버퍼로 읽어 들인다.

 

Output(X)

데이터베이스 항목 X를 포함하고 있는 블록을 디스크에 기록한다.

 

read_item(X)

주기억 장치 버퍼에서 데이터베이스 항목 X의 값을 프로그램 변수 X로 복사한다.

 

write_item(X)

프로그램 변수 X의 값을 주기억 장치 내의 데이터베이스 항목 X에 기록한다.

 

다수의 트랜잭션을 동시에 수행할 때 발생하는 문제점

갱신 손실(Lost update)

수행 중인 트랜잭션이 갱신한 내용을 다른 트랜잭션이 덮어씀으로써 갱신이 무효가 되는 것

 

오손 데이터 읽기(Dirty read)

완료되지 않은 트랜잭션이 갱신한 데이터를 읽는 것

 

반복할 수 없는 읽기(unrepeatable read)

한 트랜잭션이 동일한 데이터를 두 번 읽을 때 서로 다른 값을 읽는 것

 

갱신 손실 예시

T1 트랜잭션이 write_item(X) 하기 전에 T2 트랜잭션이 read_item(X)으로 X값을 가져와 연산을 했기 때문에 T1 트랜잭션의 X값 갱신이 손실되었다.

오손 데이터 읽기 예시

T1 트랜잭션이 UPDATE 문을 실행하고, 그 이후에 ROLLBACK으로 UPDATE 문을 취소하였다.

하지만 T2 트랜잭션이 ROLLBACK 전에 balance의 평균값을 SELECT 했기 때문에 잘못된 데이터를 읽고 있다.

반복할 수 없는 읽기 예시

T2에서 동일한 SELECT 연산이 2번 실행되었지만, 그 사이에 T1 트랜잭션이 실행되었기 때문에 서로 다른 값이 나온다.

 

로킹(Locking)

데이터 항목을 로킹하는 것은 동시에 수행되는 트랜잭션들의 동시성을 제어하기 위해서 가장 널리 사용되는 방법이다.

로크(Lock)는 데이터베이스 내의 각 데이터 항목과 연관된 하나의 변수이다.

각 트랜잭션이 수행을 시작하여 데이터 항목을 접근할 때마다 요청한 로크에 관한 정보는 로크 테이블(Lock table) 등에 유지된다.

트랜잭션에서 데이터 항목을 접근할 때 로크를 요청하고, 접근을 끝낸 후에 로크를 해제(Unlock)한다.

갱신 목적 접근 : 독점 로크(X-lock, eXclusive lock)를 요청한다.

판독(읽기) 목적 접근 : 공유 로크(S-lock, Shared lock)를 요청한다.

로크 양립성 행렬
로크를 일찍 해제할 때의 문제점

ㅇㅇㅇㅇ

2단계 로킹 프로토콜(2-phase locking protocol)

로크를 요청하는 것과 로크를 해제하는 것이 2단계로 이루어진다.

로크 확장 단계가 지난 후에 로크 수축 단계에 들어간다.

일단 로크를 한 개라도 해제하면 로크 수축 단계에 들어간다.

 

로크 확장 단계(1단계)

트랜잭션이 데이터 항목에 새로운 로크를 요청할 수는 있지만, 보유하고 있던 로크를 하나라도 해제할 수 없다.

 

로크 수축 단계(2단계)

보유하던 로크를 해제할 수 있지만, 새로운 로크를 요청할 수는 없다.

로크를 조금씩 해제할 수도 있고, 한꺼번에 모든 로크를 해제할 수도 있다.

 

로크 포인트

한 트랜잭션에서 필요로 하는 모든 로크를 걸어놓은 시점

 

데드록

운영체제에서와 유사하게, 2단계 로킹 프로토콜에서는 데드록이 발생할 수 있다.

두 개 이상의 트랜잭션들이 서로 상대방이 보유하고 있는 로크를 요청하면서 기다리고 있는 상태를 말한다.

데드록을 해결하기 위해서는 데드록을 방지하는 기법이나, 데드록을 탐지하고 희생자를 선정하여 데드록을 푸는 기법 등을 사용한다.

데드록 예시

다중 로크 단위

대부분의 트랜잭션에서는 튜플 단위로 로크를 해도 로크 테이블을 다루는 시간이 오래 걸리지는 않는다.

트랜잭션들이 많은 튜플을 접근하는 데이터베이스 응용에서 튜플 단위로만 로크를 한다면, 로크 테이블에서 충돌을 검사하고 로크 정보를 기록하는 시간이 오래 걸린다.

트랜잭션이 접근하는 튜플의 수에 따라 로크를 하는 데이터 항목의 단위를 구분하는 것이 필요하다.

한 트랜잭션에서 로크할 수 있는 데이터 항목이 두 가지 이상 있으면 다중 로크 단위라고 말한다.

단위 : 데이터베이스, 릴레이션, 디스크 블록, 튜플 등

일반적으로 DBMS는 각 트랜잭션에서 접근하는 튜플 수에 따라 자동적으로 로크 단위를 조정한다.

로크 단위가 작을수록 로킹에 따른 오버헤드가 증가하지만, 동시성의 정도 또한 증가한다.

다중 로크 단위

T1 트랜잭션이 b1 데이터 블록에 로크를 걸면 튜플에 모두 로크가 걸리기 때문에 T2 트랜잭션은 기다려야 한다.

팬텀 문제(Phantom problem)

팬텀 문제 예시

트랜잭션 T1의 SELECT문 사이에 트랜잭션 T2가 INSERT로 튜플을 넣었기 때문에 검색되는 사원이 달라진다.

한 트랜잭션 T1에서 첫 번째 SELECT문과 두 번째 SELECT문의 수행 결과가 다르게 되는데, 이를 팬텀 현상이라고 부른다.

반응형

'CS > DB' 카테고리의 다른 글

[DB] 회복  (0) 2022.06.15
[DB] 시스템 카탈로그  (0) 2022.06.09
[DB] 뷰  (0) 2022.06.07
[DB] 정규화와 역정규화  (0) 2022.05.28
[DB] 릴레이션 분해  (0) 2022.05.26