이것저것

2PL 본문

Database

2PL

nays111 2021. 1. 10. 21:47

[2pl이란?]

Lock을 걸고 해제하는 시점에 제한을 두지 않으면 두 개의 트랜잭션이 동시에 실행될 때 데이터의 일관성이 깨질 수 있으므로 로킹 단계를 2개로 구분하여 이를 방지하는 방법

 

결론 : 직렬 가능성을 보장한다 but 교착상태가 발생할 수 있다.

 

확장 단계 (Growing Phase) : 트랜잭션은 새로운 Lock 연산만 할 수 있고, Unlock 연산은 할 수 없는 단계

축소 단계 (Shrinking Phase) : 트랜잭션은 Unlock 연산만 실행할 수 있고, Lock 연산만 실행할 수 없는 단계

 

로킹 단위가 속성->튜플->릴레이션->데이터베이스로 커질 수록 구현이 용이하고, Lock의 수가 적어지며 제어가 간단하지만 병행성이 떨어진다. 그러나, 로킹 단위가 작을 수록 구현이 복잡하고, Lock의 수가 많고 제어 기법이 복잡하여도 병행성을 높일 수 있다.

 

2단계 로킹 규약은 트랜잭션들이 Lock하는 시간과 Unlock을 하는 시간을 구분하여 수행하도록 하는 것이다.

2단계 로킹 규약을 사용하지 않으면 아래의 그림과 같이 일관성이 위배되는 문제가 발생할 수 있다.

 

(초기값 : A = 1000, B = 1000 ,,,,t1이 A에 대해 작업을 하기 위해 Lock을 수행하고 100만큼을 뺏다. 작업을 완료후 Unlock 수행. t2이 A에 대해 작업을 하기 위해 Lock을 수행하고 1.1만큼 곱하여 990이 나왔다. A를 unlock하고 B에 대해 작업을 수행하기 위해 B를 Lock하였다. B에 1.1을 곱하여 B의 값은 1100이 되었다. 작업을 완료후 B에 대해서 unlock 수행 다음 t1이 B에 대한 작업을 마저 수행하기 위해 B에 Lock을 걸었다. 그리고 B에다가 100을 더하여 1200이 되었다. B는 작업을 완료했기 때문에 unlock을 수행하였다. 최종 결과 A=990, B=1200이 나왔다.)

 

==> 이럴 경우 t1의 A와 B read 사이에 t2에 의해 A나 B가 갱신되어 출력되는 합계가 달라지며, 일관성 제약 조건에 위배된다. 즉, 직렬 가능성을 보장하지 못한다.

 

그래서, 임의의 시간에 Lock 또는 Unlock을 하는 것이 아니라 확장 단계와 축소 단계를 두어 이를 해결해줍니다.

2PL은 직렬 가능성을 보장할 수 있는 규약으로 가장 많이 사용되지만, 교착상태(DeadLock)가 발생할 가능성이 있으므로 이것을 해결 해주는 것이 중요하다!!

'Database' 카테고리의 다른 글

NOSQL 에 대하여  (0) 2021.04.17
Transaction - ACID  (0) 2021.02.17
DBCP  (0) 2021.01.10
데드락  (0) 2021.01.07
WAL (Write-Ahead-Logging)  (0) 2021.01.07
Comments