개발스토리

회복과 병행제어3 본문

Computer Science/데이터베이스

회복과 병행제어3

무루뭉 2021. 5. 25. 22:09

병행 수행(concurrency)

 

- 여러 사용자가 데이터베이스를 동시 공유할 수 있도록 여러 개의 트랜잭션을 동시에 수행하는 것을 의미

- 여러 트랜잭션이 차례로 번갈아 수행되는 인터리빙(interleaving) 방식으로 진행된다.

 

 인터리빙 방식

주기억장치에 접근하는 속도를 빠르게 하는데 사용된다. 메모리 인터리빙 기법은 인접한 메모리 위치를 서로 다른 메모리 뱅크(bank)에 둠으로써 동시에 여러 곳을 접근할 수 있게 하는 것이다.

 

■ 병행 제어(concurrency control)또는 동시성 제어

- 병행 수행 시 같은 데이터에 접근하여 연산을 실행해도 문제가 발생하지 않고 정확한 수행 결과를 얻을 수 있도록 트랜잭션의 수행을 제어하는 것을 의미한다.

 

병행 수행 시 발생할 수 있는 문제점

 

■ 갱신 분실(lost update)

- 하나의 트랜잭션이 수행한 데이터 변경 연산의 결과를 다른 트랜잭션이 덮어써 변경 연산이 무효화되는 것

- 두 개의 트랜잭션이 한 개의 데이터를 동시에 갱신할 때 발생하며, 데이터베이스에서 절대 발생하면 안된다.

- 여러 트랜잭션이 동시에 수행되더라도 갱신 분실 문제가 발생하지 않고 마치 트랜잭션들을 순차적으로 수행한 것과 같은 결과 값을 얻을 수 있어야 한다.

병행 수행으로 인한 갱신 분실의 예

위 그림을 보자.

x가 원래 2000이 돼야 하는데 1500으로 되어있다. 트랜잭션 T1에 대해 갱신 분실이 발생했다.

위 그림처럼 트랜잭션을 순차적으로 수행해서 갱신 분실이 발생하지 않도록 해야한다.

 

병행 수행 시 발생할 수 있는 문제점

 

■ 모순성(inconsistency)

모순성의 예

 

트랜잭션의 ACID 기억하나용? 거기서 C가 Consistency인데 그의 반대면! 당연히 일어나서는 안되겠쥬?

- 하나의 트랜잭션이 여러 개 데이터 변경 연산을 실행할 때 일관성 없는 상태의 데이터베이스에서 데이터를 가져와 연산함으로써 모순된 결과가 발생하는 것.

- 여러 트랜잭션이 동시에 수행되더라도 모순성 문제가 발생하지 않고 마치 트랜잭션들을 순차적으로 수행한 것과 같은 결과 값을 얻을 수 있어야 한다.

 

■ 연쇄 복귀(cascading rollback)

연쇄 복귀의 예

 

- 트랜잭션이 완료되기 전 장애가 발생하여 rollback 연산을 수행하면, 장애 발생 전에 이 트랜잭션이 변경한 데이터를 가져가서 변경 연산을 실행한 다른 트랜잭션에도 rollback 연산을 연쇄적으로 실행해야 한다는 것이다.

- 여러 트랜잭션이 동시에 수행되더라도 연쇄 복귀 문제가 발생하지 않고 마치 트랜잭션을 순차적으로 수행한 것과 같은 결과를 얻을 수 있어야 한다.

 

결국에 트랜잭션을 순차적으로 실행하는 것과 같은 결과를 얻는 것이 중요하다. 

그렇다면, 트랜잭션 연산들을 수행하는 순서에 대해 알아보자.

 

트랜잭션 스케쥴

 

■ 트랜잭션에 포함되어 있는 연산들을 수행하는 순서

트랜잭션 스케줄 의미
직렬 스케줄 인터리빙 방식을 이용하지 않고 각 트랜잭션별로 연산들을 순차적으로 실행시키는 것
비직렬 스케줄 인터리빙 방식을 이용하여 트랜잭션들을 병행해서 수행시키는 것
직렬 가능 스케줄 직렬 스케줄과 같이 정확한 결과를 생성하는 비직렬 스케줄

 

직렬 스케줄(serial schedule)

■ 의미

- 인터리빙 방식을 이용하지 않고 각 트랜잭션 별로 연산들을 순착적으로 실행시키는 것

■ 특징

- 직렬 스케줄에 따라 트랜잭션이 수행되면, 다른 트랜잭션의 방해를 받지 않고 독립적으로 수행되므로 항상 모순이 없는 정확한 결과를 얻게 된다.

- 다양한 직렬 스케줄이 만들어질 수 있고, 직렬 스케줄마다 데이터베이스에 반영되는 최종 결과가 다를 수 있지만 직렬 스케줄의 결과는 모두 정확하다.

- 각 트랜잭션을 독립적으로 수행하기 떄문에 병행 수행으로 볼 수 없다.

 

비직렬 스케줄(nonserial schedule)

■ 의미

- 인터리빙 방식을 이용하여 트랜잭션을 병행 수행하는 것

■ 특징

- 트랜잭션이 번갈아 연산을 실행하기 때문에 하나의 트랜잭션이 완료되기 전에 다른 트랜잭션의 연산이 살행될 수 있다

- 비직렬 스케줄에 따라 병행 수행하면 갱신 분실, 모순성, 연쇄 복귀 등의 문제가 발생할 수 있어 결과의 정확성을 보장할 수 없다.

- 다양한 비직렬 스케줄이 만들어질 수 있고 그 중에는 잘못된 결과를 생성하는 것도 있다.

 

직렬 가능 스케줄(serializable schedule)

■ 의미

- 직렬 스케줄에 따라 수행한 것과 같이 정확한 결과를 생성하는 비직렬 스케줄

- 비직렬 스케줄 중에서 수행 결과가 동일한 직렬 스케줄이 있는 것

■ 특징

- 인터리빙 방식으로 병행 수행하면서도 정확한 결과를 얻을 수 있다.

- 직렬 가능 스케줄인지 판단하는 것은 간단한 작업이 아니므로 직렬 가능성을 보장하는 병행제어 기법을 사용하는 것이 일반적이다.

 

병행 제어

 

- 병행 수행하면서도 직렬 가능성을 보장하기 위한 기법

■ 방법

- 모든 트랜잭션이 준수하면 직렬 가능성이 보장되는 규약을 정의하고, 트랜잭션들이 이 규약을 따르도록 한다.

■ 대표적인 병행 제어 기법

- 로킹 기법

 

로킹 기법

 

■ 기본 원리

- 한 트랜잭션이 먼저 접근한데이터에 대한 연산을 끝낼 때까지는 다른 트랙잭션이 그 데이터에 접근하지 못하도록 상호 배제 한다.

■ 방법

- 병행 수행되는 트랜잭션들이 같은 데이터에 동시에 접근하지 못하도록 lock과 unlock 연산을 이용해 제어한다.

lock : 트랜잭션이 데이터에 대한 독점권을 요청하는 연산

unlock : 트랜잭션이 데이터에 대한 독점권을 반환하는 연산

■  기본 로킹 규약

- 트랜잭션은 데이터에 접근하기 위해 먼저 lock 연산을 실행해 독점권을 획득한다. ( read, write 연산을 실행하기 전 lock 실행)

- 다른 트랜잭션에 의해 이미 lock 연산이 실행된 데이터에는 다시 lock 연산을 실행할 수 없다.

- 독점권을 획득한 데이터에 대한 모든 연산의 수행이 끝나면 트랜잭션은 unlock 연산을 실행해서 독접권을 반납한다.

■ 로킹 단위

- lock 연산을 실행하는 대상 데이터의 크기

- 전체 데이터베이스부터 릴레이션, 투플, 속성까지도 가능

- 로킹 단위가 커질수록 병행성은 낮아지지만 제어가 쉽다.

- 로킹 단위가 작아질수록 제어가 어렵지만 병행성은 높아진다.

 

기본 로킹 규약의 효율성을 높이기 위한 방법

 

■ 트랜잭션들이 같은 데이터에 동시에 read 연산을 실행하는 것을 허용한다.

lock 연산은 두 가지 종류로 구분되어서 사용된다.

1) 공유락(LS, shared lock) : 트랜잭션이 읽기를 할 때 사용하는 lock , 데이터에 대한 사용권을 여러 트랜잭션이 함께 가질 수 있다.

2) 배타락(LX, exclusive lock) : 읽고 쓰기를 할 때 사용하는 lock , 실행한 트랜잭션만 해당 데이터에 대한 독점권을 가질 수 있다.

 

■ 공유락과 배타락을 사용하는 규칙

- 데이터에 lock이 걸려있지 않으면 트랜잭션은 데이터에 락을 걸 수 있다.

- 트랜잭션이 데이터 X를 읽기만 할 경우 LS(X)를 요청하고, 읽거나 쓰기를 할 경우 LX(X)를 요청한다.

- 다른 트랜잭션이 데이터에 LS(X)을 걸어둔 경우, LS(X)의 요청은 허용하고 LX(X)는 허용하지 않는다.

- 다른 트랜잭션이 데이터에 LX(X)을 걸어둔 경우, LS(X)와 LX(X) 모두 허용하지 않는다.

- 트랜잭션이 lock을 허용받지 못한다면 대기 상태가 된다.

  공용 lock(LS 상태) 전용 lock(LX 상태)
공용 lock(LS 상태) 가능 불가능
전용 lock(LX 상태) 불가능 불가능

 

2단계 로킹 규약(2PLP; 2 Phase Locking Protocol)

 

■ 의미

- 기본 로킹 규약의 문제를 해결하고 트랜잭션의 직렬 가능성을 보장하기 위해 lock과 unlock 연산의 수행 시점에 대한 새로운 규약을 추가한 것

■ 방법

- 트랜잭션이 lock과 unlock 연산을 확장 단계축소 단계로 나누어 실행

 

> 트랜잭션이 처음 수행되면 확장 단계로 들어가 lock 연산만 실행 가능

> unlock 연산을 실행하면 축소 단계로 들어가 unlock 연산만 실행 가능

> 트랜잭션은 첫 번째 unlock 연산 실행 전에 필요한 모든 lock 연산을 실행해야 한다.

 

 

하지만 단점도 존재한다. 바로 독점에 대한 문제이다.

교착 상태(deadlock)

- 트랜잭션들이 상대가 독점하고 있는 데이터에 unlock 연산이 실행되기를 서로 기다리면서 트랜잭션의 수행을 중단하고 있는 상태

- 교착 상태가 발생하지 않도록 예방하거나, 발생 시 탐지하여 필요한 조치를 취해야 한다.

'Computer Science > 데이터베이스' 카테고리의 다른 글

권한 관리  (0) 2021.06.07
회복과 병행제어4  (0) 2021.06.06
회복과 병행제어2  (1) 2021.05.25
회복과 병행 제어  (0) 2021.05.24
정규화  (0) 2021.05.22
Comments