lock규약을 지키도록 제한하여 원하는 유형의 트랜잭션 스케줄만을 생성한다.
강한록으로의 변환은 증가단계, 약한 록으로의 변환은 감소단계에서만 가능.
사용자가 직접적으로 록을 요구/해제하지 않는다.
dbms에서 통제한다.
록을 담당하는 프로세스 독립적으로 구성가능.
록매니저가 록테이블을 관리하며 록 처리 수행.
특정 트랜잭션이 계속 록을 획득하지 못해 오래 기다리는 현상.
교착상태(deadlock)가 발생하지 않는다.
데이터간의 순서를 정한 후 한쪽 방향으로만 흐르기에 서로 기다리는 상태가 발생하지 않는다.
회복 불가능한 스케줄/연속 철회 스케줄을 생성하기도 함.
때문에 commit연산과의 관계를 고려해야 한다.
록을 해제하고도 또 다시 록을 요구할 수 있다. 하지만 록을 걸었다 해제한 데이터 항목에 대해서는 안된다.
locking의 대상이 되는 데이터 항목에 관한 설명이다.
locking이 적용되는 데이터 크기는 다양할 수 잇다.(MGL)
데이터를 크기에 따라 계층적으로 표현 가능하며, 상위노드에 대한 명시적 lock은 하위노드에 대해 묵시적으로 lock을 잡는 효과가 있다.
일정시간 지나면 록을 기다리지 않게 하는 방식.
새롭게 록을 요구하는 트랜잭션이 기존 트랜잭션보다
old하면 wait하고(기존 트랜잭션의 철회), young하면 철회한다.
대기그래프
dbms는 성능상의 이유로 not serializable한 스케줄을 허용하기도 한다.-> 완화된 일치성
완화된 일치성을 제공하는 형식 중 하나가 2단계 일치성이다.
s-lock이 아무떄나 해제되고 lock을 아무때나 걸 수 있다.-> 직렬가능이 보장되지 않음.
그중 커서 안정방식: 커서가 위치하는 동안 읽기록을 잡고 있는다.->커서가 위치한 데이터는 타 트랜잭션에 의해 변경되지 않는다.
사용자의 요구에 따라 트랜재션의 고립완화정도를 정할 수 있다.
serializable
repeatable read:읽은 값이 트랜잭션 끝까지 유지된다. 먼저 읽은 사람이 쓰기의 우선권이 있다. 하지만 트랜잭션 동안에 갱신되는 데이터들을 새로 읽어가며 수행할 수 없다.
read committed: 록은 집고 읽은 후 즉시 록을 풀기에 자신이 데이터 쓰기전 다른 트랜잭션이 먼저 쓸 수도 있다.(티켓팅 이선좌)
read uncommitted: 읽기 연산에서 록을 잡지 않아 읽기 전/후 데이터가 변할 수 있다.
많은 dbms에서 고립도의 기본값은 read committed이다.
트랜잭션에 타임스탬프가 붙고, 젊은 트랜잭션이 아직 읽지 않았을 경우에 데이터에 대한 쓰기가 가능하다. 이미 읽었다면 늙은 트랜젹션 t는 록백된다. 읽기 연산에 대한 대기가 없다.
트랜잭션에 대해 데이터베이스의 스냅샷을 제공, 거기에 읽기/쓰기를 한다.
각 트랜잭션은 자신이 한 쓰기 연산에 대한 변화만 인지 할 수 있다. 트랜잭션은 후에 충돌검사를 하고 먼저 commit한 쪽은 유지되며 나중의 commit트랜잭션은 롤백된다.
-1 read commited or read uncommited
이유는 read uncommited는 락을 안 잡기에 t2반영
read commited는 락을 잡고 읽고 락을 풀기에 데이터를 읽고 나서 풀기에 그 사이에 t2가 값을 고칠 수있다.
-2 같은 value이려면
serializable 또는 repeatable read(새로운 터플이 삽입/삭제 되는 경우가 아니기에 팬텀현상은 안 일어남.)
2pl을 비롯한 여러 규약에서는 savepoint를 막 생성할 수 없다.
록을 거는데 제한이 있는 한 savepoint를 생성할 수 없는 경우도 있다.
no(t2가 younger해서 자신이 die하기에)
yes(t2가 wound해서 younger한 t3가 rollback되므로)
no(restart하는 트랜잭션은 항상 원래 timestamp를 가지고 실행행 한다-livelock방지)