본문 바로가기
DATABASE

데이터베이스(DB) 병행 제어

by YoonJong 2022. 11. 1.
728x90

데이터베이스 관리 시스템에서는 여러 사용자가 동시에 데이터를 공유할 수 있도록 여러개의 트랜잭션이 동시에 수행되는 병행 수행을 지원한다.

 

하지만, 트랜잭션이 수행 중에 다른 트랜잭션이 같은 데이터에 접근해 값을 변경하면 예상치 못한 결과가 나올 수 있다.

따라서 병행수행을 하더라도 각 트랜잭션이 다른 트랜잭션에 방해를 받지 않도록 해야한다.

위와 같이 문제점을 해결하기 위한 것으로 병행 제어 , 동시성 제어 기법을 사용한다

 

제어가 없으면 여러 문제가 생길 수 있다.

하나의 트랜잭션이 끝나고 다른 트랜잭션이 개입해야한다.

갱신 분실 : 하나의 트랜잭션이 수행한 데이터 변경 연산의 결과를 다른 트랜잭션이 덮어써 변경 연산이 무효화 된다.

모순성 : 하나의 트랜잭션이 여러 개의 변경 연산을 실행할 때, 일관성없는 데이터를 가져와 연산을 진행함으로써 모순된 결과가 나타난다.

연쇄 복귀 : 트랜잭션이 완료되기전 장애가 발생해서 rollback 을 했는데, 다른 트랜잭션에서 rollback 이전에 커밋되어 rollback 을 실행하지 못한다.


병행 수행에서는 트랜잭션이 차례로 번갈아 가면서 진행하게 되는데 트랜잭션 스케줄에 의해 실행된다.

트랜잭션 스케줄은 트랜잭션에 포함되어 있는 연산들을 수행하는 순서를 의미한다.

대부분의 데이터베이스 관리 시스템에서는 직렬 스케줄인지 확인하는 것이 쉽지 않아서 병행 제어 기법을 사용한다.

 

직렬 스케줄 : 인터리빙 방식을 사용하지 않고 순차적으로 실행시켜 항상 모순이 없는 정확한 결과값을 얻을 수 있다.

비직렬 스케줄 : 인터리빙 방식을 이용하여 트랜잭션들을 병행해서 수행한다. 결과값을 보장할 수 없다.

 * 인터리빙 : 끼워넣는 방식

직렬 가능 스케줄 : 직렬 스케줄과 같이 정확한 결과를 생성하는 비직렬 스케줄


병행 제어 기법

여러 트랜잭션을 병행 수행하면서도 정확한 결과를 얻을 수 있는 직렬 가능성을 보장받기 위해 사용한다.

 

로킹기법 ( locking )

병행 수행되는 트랜잭션들이 동일한 데이터에 동시에 접근하지 못하도록 lockunlock 이라는 연산을 이용해 제어한다.

한 트랜잭션이 먼저 접근한 데이터에 대한 연산을 모두 마칠 때 까지, 다른 트랜잭션이 접근하지 못하도록 상호 배제 하여 직렬 가능성을 보장하는 것이다.

 

lock 은 데이터에 대한 독점권을 갖기 위해 사용하고, unlock은 독점권을 반납하기 위해 사용한다.

너무 엄격한 제약이 있으면, 데이터에 대한 독점권을 한 트랜잭션만 가질 수 있으므로, 상황에 따라 효율적인 로킹기법을 사용해야한다 .

예를 들면 write 는 동시접근을 하지 못하게 해야하지만, read 작업에 대해서는 여러 트랜잭션이 접근해도 상관없으므로 동시에 접근하게 한다.

 

공용lock : 해당 데이터에 read 연산을 진행할 수 있지만, write 연산은 진행할 수 없다.

전용lock : 해당 데이터에 read 연산과 write 연산 모두 진행할 수 있다.

 

 

 

728x90

댓글