반응형

병행 수행

- 여러 사용자가 DB를 동시 공유할 수 있게 여러개의 트랜잭션을 동시에 수행하는 것

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

(단위 시간에 많은 트랜잭션을 처리하기 위해)

(트랜잭션 제각각 처리 시간이 다르므로, 처리시간이 긴 연산 수행 동안 다른 연산 수행)

 

병행제어

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

- 정확한 수행 결과가 아닌 경우가 발생하지 않게 병행제어를 잘 해야한다.

 

 

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

1. 갱신 분실

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

- 여러 트랜잭션이 동시에 수행되더라도 순차적으로 수행한것과 같은 결과값을 얻을 수 있어야된다.

=> T1에 대해 갱신 분실이 발생한다.

 

트랜잭션을 순차적으로 수행하면 해결된다.

 

 

2. 모순성

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

T1이 X, Y를 다른 상태의 데이터베이스에서 가져와 

트랜잭션 T1의 결과가 X= 4000, Y = 4000이 아닌 X=2000, Y=2500의 잘못된 결과가 나온다.

T1이 완료된후 T2가 실행되면 모순성 문제가 발생하지 않는다.

 

3. 연쇄복귀

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

==> 장애로 잘못된 결과가 나오고 그 잘못된 결과를 가져가 다른 트랜잭션이 연산을 수행했으므로

(T1 -> 결과(문제발생) -> T2 -> 결과(문제발생!, 잘못된 결과로 연산하였으므로)

 

T2는 T1이 변경한 X를 가져가 연산을 수행한다.

T1 트랜잭션 완료 전 장애가 발생한다.

T1을 rollback해야하지만, T2는 연산이 이미 끝나 rollback이 불가하다.

순차적으로 수행 (T1완료후  -> T2수행)하면 연쇄 복귀 문제가 발생하지 않는다.

 

 

트랜잭션 스케줄

1. 직렬 스케줄 => 인터리빙이 아닌, 각 트랜잭션별로 연산을 순차적으로 실행 => 시간이 길어짐

2. 비직렬 스케줄 => 인터리빙 방식으로 트랜잭션 병행해서 수행 => 병행성 문제 발생

3. 직렬 가능 스케줄 => 직렬스케줄처럼 정확한 결과를 생성하는 비직렬 스케줄 => 시간을 줄이고 병행성 문제 해결

 

1. 직렬 스케줄

- 다른 트랜잭션의 방해를 받지 않고 독립적으로 수행 => 항상 모순 없는 결과

- 병행 수행이 아님 => 시간이 오래걸림

- 다양한 직렬 스케줄을 만들 수 있음

 

T1 -> T2

T2 -> T1

 

2. 비직렬 스케줄

- 트랜잭션이 번갈아 연산 실행 => 하나의 트랜잭션 완료전 다른 트랜잭션 연산 실행가능

- 갱신분실, 모순성, 연쇄복귀 문제 발생하여 결과의 정확성 보장 X

- 다양한 비직렬 스케줄 생성가능 (그중엔 잘못된 결과를 생성하기도함)

 

비직렬 스케줄이지만 병행 수행에 성공하여 정확한 트랜잭션 수행 결과를 생성한다. => 직렬가능 스케줄

 

병생 수행에 실패하여 잘못된 결과를 생성한다.

 

 

 

 

3. 직렬 가능 스케줄

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

- 인터리빙 방식으로 병행수행하면서 정확한 결과 얻음

- 직렬 가능 스케줄인지 판단한는것은 복잡한 작업

- 따라서 직렬가능성을 보장하는 병행제어 기법 사용 

 

 

 

병행 제어 기법

- 병행 수행하면서 직렬 가능성도 보장

- 모든 트랜잭션이 준수하면 직렬가능성이 보장되는 rule 정의

- lock 기법이 있음

 

lock기법 - 상호배제

- 병행 수행되는 트랜잭션들이 같은 데이터에 동시에 접근하지 못하게 lock/unlock연산

lock - 트랜잭션이 데이터에 대한 독점권 요청

unlock - 트랜잭션이 데이터에 대한 독점권 반환

 

- 데이터에 접근하기 전 lock하여 독점권을 획득 (read/write 전 lock)

- 다른 트랜잭션에 의해 이미 lock이 걸린 데이터는 lock 불가& 실행 불가

- 연산 수행 끝나면 unlock

 

lock 단위가 커지면 병행성은 낮아지지만 제어가 쉬워지고

단위가 작아지면 제어가 어렵지만 병행성은 높아진다.

 

lock 효율 향상 => 동시성이 높아짐

공용 lock => read만 가능

- read연산 수행가능 ,write 불가 

- 다른 트랜잭션도 동시에 공용 lock 가능

- 데이터 사용권을 여러 트랜잭션이 함께 가지는 것 가능

 

전용 lock => write하기 위해

- read/write 둘다 가능

- 다른 트랜잭션은 어떠한 lock 연산도 실행 불가

- 데이터에 대한 독점권 가짐

 

T1이 X에 대해 빨리 unlock을 해버려 T2가 일관성 없는 데이터에 접근하여 잘못된 결과가 나온다.

(T1이 끝날때까지 lock을 해야한다.)

 

2단계 lock rule = 축소, 확장

- 위와 같은 기본 lock rule의 문제 해결

- 직렬 가능성 보장 위해 lock/unlock연산 수행 시점에대한 새로운 rule 추가

- 트랜 잭션이 처음수행되면 확장단계 => lock만 가능 (lock을 검)

- unlock 연산을 실행하면, 축소단계 => unlock만 가능

- 트랜잭션은 첫번째 unlock 연산전, 필요한 lock 연산을 실행해야한다.

 

하지만 이러한 방법도 

T1 -> X (lock)  ====> Y가 unlock 되길 기다림

T2 -> Y (lock) =====> X가 unlock 되길 기다림

과 같은 경우 데드락이 발생 할 수 있다.

따라서 교착 상태가 발생되지 않게 예방하거나 빨리 탐지하여 조치를 해야한다.

 

 

 

 

 

 

728x90
반응형

'공부 > 데이터베이스' 카테고리의 다른 글

회복과 병행제어 - 회복  (0) 2021.06.03
관계 대수  (0) 2021.06.03
파이썬 연동 예제  (0) 2021.06.02
index  (0) 2021.06.02
데이터 베이스 보안  (0) 2021.06.02
블로그 이미지

아상관없어

,