데이터마다 가지고 있는 lock을 취득해야만 데이터를 변경하거나 읽을 수 있음.
lock이 없으면 취득할 때까지 기다려야함.
concurrency control을 구현하기 위해 사용.

unlock이 될 때까지 기다렸다가 unlock돼서 해제되면 그 때서야 트랜잭션 실행 가능.
write_lock (=exclusive lock)
: read/write(insert,delete,modify)할 때 사용.
다른 tx가 같은 데이터를 read/write하는 것을 허용하지 않음.
read_lock (=shared lock)
: read할 때 사용.
다른 tx가 같은 데이터를 read하는 것을 허용


tx에서 모든 locking operation이 최초의 unlock operation 보다 먼저 수행되도록 하는 것
concurrency control이 Serializability를 보장하기 위해서 사용.
왜 필요하지?
2PL 프로토콜을 따르지 않으면 nonserializable해져서 tx순서에 따라 결과가 각각 다르게 나올 수 있어서.


2PL에서 상황에 따라 Deadlock이 발생하고 해결하는 방법은 OS의 데드락의 해결방법과 동일함.
-종류
conservative 2PL
: 모든 lock을 취득한 뒤에 transaction 시작.
deadlock이 발생하지 않지만 트랜잭션을 시작하려면 모든 lock을 가진 후에나 실행할 수 있어서 실용적이지 않음.
strict 2PLdptj
: strict shedule(rollback이 발생했을 때 이상한 현상이 발생되지 않도록 하는 것)을 보장하는 2PL.
write_lock을 commit / rollback 될 때 반환함.
많이 쓰임.
strong strict 2PL(=ss2PL)
: strict 2PL보다 더 업그레이드 되고 구현이 쉬움.
read_lock / write_lock 모두 commit / rollback 될 때 반환함.
많이 쓰임.
출처: https://www.youtube.com/watch?v=0PScmeO3Fig&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=18&t=10s