이것저것
Locking (로킹) 본문
[Lock이란?]
로킹 기법 : 트랜잭션들이 동일한 데이터 항목에 대해 임의적인 병행 접근을 하지 못하도록 제어하는 것
"나 지금 작업할거니깐 Lock 걸 것이고 Lock건 동안에는 접근 못해!"
- 트랜잭션 T가 데이터 항목 X에 대해 Read(X) or Write(X) 연산을 수행하려면 반드시 lock(X) 연산을 해주어야함
- 트랜잭션 T가 실행한 lock(X)에 대해서는 해당 트랜잭션이 종료되기 전에 반드시 unlock(X) 연산을 해주어야함
- 트랜잭션 T는 다른 트랜잭션에 의해 이미 lock이 걸려있는 X에 대해 다시 lock을 수행시키지 못한다.
- 트랜잭션 T가 X에 lock을 걸지 않았다면, unlock(X)를 수행시키지 못한다.
즉, 여러개의 트랜잭션들이 하나의 데이터로 동시에 접근하려고 할 때 이를 제어해주는 도구가 바로 Lock이다.
Lock은 트랜잭션이 읽기 할 때 사용하는 공유락 (LS, Shared Lock)과 읽고 쓰기를 할 때 사용하는 베타락 (LX, Exclusive Lock)으로 나뉩니다.
트랜잭션 T가 데이터 항목 X에 대하여 Shared-Lock 을 설정할 경우, 트랜잭션 T는 해당 데이터 항목에 대해서 읽을 수는 있지만 기록할 수가 없습니다. 그리고 Read는 트랜잭션들간의 영향을 주지 않으므로 다른 트랜잭션도 Shared-Lock이 설정된 X에 대해서 Shared-Lock을 동시에 설정할 수 있습니다.
트랜잭션 T가 데이터 항목 X에 대하여 Exclusive Lock을 설정할 경우, 트랜잭션 T는 해당 데이터 항목에 대해서 읽을 수도 있고 기록할 수도 있습니다. Write는 다른 트랜잭션에도 영향을 주는 작업이기 때문에 다른 트랜잭션은 Exclusive-Lock을 설정한 데이터 항목 X에 대해서 어떠한 lock도 설정할 수 없습니다.
[공유락과 베타락을 사용하는 규칙]
- 데이터에 Lock이 걸려있지 않으면 트랜잭션은 데이터에 Lock을 걸 수 있다.
- 트랜잭션이 데이터 X를 읽기만 할 경우 LS(X)를 요청하고, 읽거나 쓸 경우 LX(X)를 요청한다.
- 다른 트랜잭션이 데이터에 LS(X)를 걸어둔 경우, LS(X)의 요청은 허용하고 LX(X)는 허용하지 않는다.
- 다른 트랜잭션이 데이터에 LX(X)를 걸어둔 경우, LS(X)와 LX(X) 모두 허용하지 않는다.
- 트랜잭션이 Lock을 허용받지 못하면 대기 상태가 된다.
'Database' 카테고리의 다른 글
MVCC (다중버전 동시성 제어) (0) | 2021.04.19 |
---|---|
DB 동시성 제어 (0) | 2021.04.17 |
NOSQL 에 대하여 (0) | 2021.04.17 |
Transaction - ACID (0) | 2021.02.17 |
2PL (0) | 2021.01.10 |
Comments