Locking은 한 번에 하나의 트랜잭션이 데이터를 수정할 수 있도록 하는 방법입니다.
공유잠금을 설정한 트랜잭션은 데이터 항목에 대해 읽기 연산만 가능합니다.
여러 트랜잭션이 읽기만 하는 경우 다른 트랜잭션들과 공유하여 사용할 수 있습니다. 예를 들어, 테이블 A의 데이터를 읽는 트랜잭션 1과 2가 동시에 실행 중일 때, 둘 다 데이터에 Shared Lock을 걸어 읽을 수 있습니다. 이 때 다른 트랜잭션들은 읽기 작업만 가능하고 수정 작업은 불가능합니다.
즉, T1이 S-Locks을 설정했을때 unlock 전에 T2가 동일 데이터에 접근한다면 읽기만 가능하게 됩니다.
하지만 만약 T1이 S-Lock을 설정했을때 T2가 데이터를 수정하려고 하면 T1의 작업이 끝날때까지 기다려야합니다. (Lock 충돌)
X-Locks를 설정한 트랜잭션은 데이터 항목에 대해 읽기 연산과 쓰기 연산이 모두 가능합니다.
하나의 트랜잭션만이 획득할 수 있으며, 획득한 트랜잭션이 해당 데이터를 수정할 때(unlock)까지 다른 트랜잭션들은 대기해야 합니다. X-Lock은 다른 Lock들과 충돌이 발생하며, 다른 트랜잭션이 이미 S-Lock을 획득한 상황에서는 X-Lock을 요청할 수 없습니다. 만약 X-Lock이 이미 다른 트랜잭션에 의해 획득되어 있다면, 다른 트랜잭션들은 해당 Lock이 해제될 때까지 대기해야 합니다.
X-Lock은 트랜잭션의 일관성을 유지하기 위한 중요한 요소 중 하나입니다. 트랜잭션 A가 특정 데이터를 수정하기 위해 X-Lock을 획득하고, 이 작업이 완료되면 해당 Lock을 해제합니다. 이후 트랜잭션 B가 동일한 데이터를 수정하기 위해 X-Lock을 획득할 수 있습니다. 이러한 과정을 통해 데이터 일관성을 보장할 수 있습니다.
잠금 설정 규칙(Locking Protocol)은 동시성 제어를 위해 데이터베이스 시스템에서 채택하는 규칙입니다. 이 규칙은 여러 개의 트랜잭션이 데이터베이스에 접근할 때, 데이터의 일관성과 동시성을 보장하기 위해 잠금(락)을 설정하는 방식을 규정합니다.
위 그림처럼 T14와 T15를 동시에 실행할때 T14에서 write(x)연산을 하고 x-lock(y)연산을 하기 전에 T15가 실행되면 T15는 S-lock(y)는 정상적으로 얻게되지만 S-lock(x)는 T14에서 잠가놓았기 때문에 얻을 수 없고 대기상태로 들어가게 됩니다. 하지만 T14 또한 X-lock(y) 연산을 진행하려 하지만 T15에서 잠가놨기 때문에 마찬가지로 대기상태에 들어가게 되며, T14와 T15 모두 대기상태에 계속 빠지게 됩니다. 이러한 상황을 교착상태라 합니다.
이러한 상황에 빠지지 않도록 여러 규약들이 있습니다.