lock은 data에 대한 concurrent한 access를 control하기 위한 mechanism
Data item은 두 가지 lock을 가질 수 있음
1. exclusive(X) lock: read/write 둘 다 가능 lock-X instruction으로 요청
2. shared(S) lock: read만 가능 lock-S로 요청
Lock request는 concurrency control manager에 의해 수행됨
Transaction은 request가 받아들여져야 계속해서 진행 가능
Lock-compatibility matrix

shared lock만 한번에 다수의 transaction들이 가질 수 있음
Deadlock 발생조건
대부분의 locking protocol에서 deadlock은 존재
Starvation(무한 대기)또한 발생 가능
conflict serializable 보장
Phase 1: Growing Phase
Phase 2: Shrinking Phase
2PL이 conflict-serializable을 보장하기는 하지만, conflict-serializable이려면 반드시 2PL이 필요한 것은 아님
recoverability보장을 위한 2PL의 확장
Strict 2PL: transaction은 commit/abort되기 전에는 모든 exclusive lock을 들고 있어야 함
Rigorous 2PL: transaction은 commit/abort되기 전에는 모든 lock을 들고 있어야 함
대부분 Rigorous 2PL을 사용 -> 기본적으로 2PL이라하면 이거임
2PL은 deadlock이 없음을 보장하지 않음
Growing Phase
Shrinking phase
여전히 serializability 보장
lock manager는 별개의 process로 구현
transaction은 lock, unlock request를 message로 전송
lock manager는 lock grant message를 전송함으로서 lock request에 응답
lock manager는 lock table로 lock 관리

각 데이터에 접근하는 transaction들에 대한 lock상태를 표시
새 request는 data의 transaction queue에 끝에 삽입됨
transaction이 abort되면 해당 queue의 모든 transaction이 삭제됨
2PL의 대안
data item set에 partial ordering을 붙여 locking 순서를 지정
exclusive lock만 허용
첫번째 lock은 아무 data item이나 가능
data Q의 lock을 얻으려면 database graph상의 Q의 모든 부모의 lock을 가지고 있어야 됨
unlock은 언제든지 가능
unlock한 data에 대한 lock을 바로 다시 잡을 수 없음
Tree protocol은 conflict serializability와 deadlock free를 보장
tree protocol은 2PL보다 unlock timing이 빠름
결점
2PL로 schedule이 불가능한 schedule이 tree에서는 가능, 그 역도 성립
Deadlock에 빠지지 않는 것을 보장
다음과 같은 전략이 있음
wait-die scheme - non-preemptive
wound-wait scheme - preemptive
Timeout-based scheme
Wait-for graph
vertex: transaction
edge from Ti->Tj: Ti가 Tj가 들고있는 lock을 대기
wait-for graph에 cycle이 있으면 deadlock이 발생

몇몇 transaction을 roll back 시킴
얼만큼 roll back 시킬지
Starvation 해결-가장 오래된 transaction은 roll back되지 않도록 함
lock을 잡는 범위와 concurrency는 반비례
Fine granularity(lower in tree): high concurrency, high locking overhead
Coarse granularity(higher in tree): lower locking overhead, low concurrency
Granularity Hierarchy
tree의 top level에서부터 DB-area-file-record

S, X lock 말고도 granularity를 반영한 lock mode들이 있음

Ti가 node Q에 lock을 얻으려면 다음과 같은 규칙을 따름
1. lock compatibility matrix 확인
2. root가 가장 먼저 look 되어야 함
3. 그 전에 Ti가 Q의 부모노드의 IX 또는 IS lock을 얻었어야 S나 IS 가능
4. 그 전에 Ti가 Q의 부모노드의 SIX, IX lock을 얻었어야 IX, SIX, X 가능
5. Ti는 이전에 unlock되지 않은 node만 lock 가능(2PL)
6. Ti는 이전에 Q의 child들에게 lock을 걸지 않았을 때만 Q unlock 가능
lock 걸기는 root -> leaf 순으로
unlock은 leaf -> root 순으로
insert/delete operation의 규칙
read/write는 delete와 conflict
inserted tuple은 해당 transaction이 commit되기 전까지 다른 transaction에서 접근 할 수 없음
Phantom Phenomenon
phantom phenomenon의 예시
T1이 relation에 대한 predicate read(scan)을 함
select count(*)
from instructor
where dept_name = 'Physics'
그리고 T2는 tuple을 insert함 T1이 active된 동안에 (predicate read 이후)
insert into instructor values('1111', 'Feynman', 'Physics', 94000)
tuple level에서의 lock만 사용하면, non-serializable함
Handling Phantom
data level의 conflict
해결