이 글을 읽기전 동시성 제어의 사전지식과 동시성 제어를 해야하는 이유에 대해 먼저 보고 오시는것을 추천드립니다.
주차장 시스템에서 Locking 기법을 사용할 경우, 예약, 입차, 출차 등의 데이터 접근을 제어하여 동시에 여러 트랜잭션이 데이터를 변경하거나 접근하는 것을 막을 수 있습니다.
예를 들어, 예약을 예로 들어보면, 두 명 이상의 사용자가 동시에 같은 자리를 예약할 경우, 한 사용자가 예약한 자리가 이미 다른 사용자에 의해 예약되었음에도 불구하고 또 다른 사용자가 예약을 하여 중복 예약이 발생할 수 있습니다. 이러한 문제를 해결하기 위해서 예약을 진행하는 트랜잭션이 해당 자리를 예약할 때 해당 자리에 대한 Lock을 설정하고, 다른 사용자가 예약을 진행하려고 할 경우 해당 자리에 대한 Lock이 설정되어 있으면 대기하도록 제어할 수 있습니다.
이와 같은 방식으로, 입차와 출차도 각각의 자리에 대해 Lock을 설정하여 여러 트랜잭션이 동시에 입차나 출차를 시도하지 못하도록 제어할 수 있습니다. 또한, 주차장의 주차 가능 자리 수에 대한 정보도 Lock을 설정하여 여러 트랜잭션이 동시에 자리 수를 변경하거나 접근하는 것을 막을 수 있습니다.
Locking 기법의 단점은 다음과 같습니다
이러한 단점을 보완하기 위해 다른 동시성 제어 기법들도 사용할 수 있습니다.
주차장 시스템에서 timestamp 기법을 사용하면 각각의 트랜잭션은 고유한 timestamp를 할당 받으며, 이를 사용하여 동시성을 제어합니다.
주차장 시스템에서 예약, 취소, 입차, 출차 트랜잭션은 모두 동시에 발생할 수 있으므로, 각 트랜잭션에 대한 timestamp를 할당하여 동시성 문제를 해결할 수 있습니다.
예약 및 취소 트랜잭션은 읽기 연산이므로 read timestamp를 사용합니다. 읽기 트랜잭션은 데이터베이스에서 해당 데이터를 읽을 때 timestamp를 가져옵니다. 그리고 이 timestamp가 데이터베이스 내부의 commit timestamp보다 작으면 해당 트랜잭션은 취소됩니다.
입차 및 출차 트랜잭션은 쓰기 연산이므로 write timestamp를 사용합니다. 쓰기 트랜잭션은 데이터베이스에서 해당 데이터를 수정할 때 timestamp를 할당합니다. 그리고 이 timestamp가 데이터베이스 내부의 commit timestamp보다 작으면 해당 트랜잭션은 취소됩니다.
또한, 각각의 트랜잭션이 커밋되면 commit timestamp가 할당되며, 이 timestamp는 다른 트랜잭션들이 읽거나 쓸 때 사용됩니다. 다른 트랜잭션은 commit timestamp를 사용하여 동시성을 제어하게 됩니다.
이러한 방식으로 timestamp 기법을 사용하면 주차장 시스템에서 발생하는 동시성 문제를 해결할 수 있습니다.