앱(게임 서버)이 데이터베이스에 질의를 던지면(➊) 데이터베이스 질의를 수행하는 코디네이터(coordinator)는 질의에 관련된 레코드가 있는 위치를 어떤 데이터베이스에 묻습니다(➋). 이 데이터베이스는 우리가 만들면 됩니다. 이 데이터베이스를 로케이터 데이터베이스라고 명명합시다. 그렇게 해당 샤드 위치를 파악한 후(➌) 해당 샤드에서 레코드 액세스를 처리하여(➍) 결과를 받습니다(➎, ➏).
앞서 관계형 데이터베이스는 원자성과 일관성을 제공한다고 살펴보았습니다. 그리고 트랜잭션도 알아보았습니다. 관계형 데이터베이스는 기본적으로 데이터 일관성을 중요하게 여기므로, 수평 분산(수평 확장)을 이용한 스케일 아웃을 하면 처리 속도 측면에서 문제점이 생깁니다.
수평 분산을 하면 어떤 데이터는 기기 두 대 이상에 나누어 저장됩니다. 즉, 데이터는 어떤 기기에 저장되고, 그 데이터가 어디에 있는지 가리키는 데이터(로케이터)는 또 다른 기기에 저장됩니다.
우리가 어떤 데이터에 변화를 준다고 가정합시다. 이때 로케이터 역할을 하는 데이터에도 변화가 있어야 할 때가 있습니다. 관계형 데이터베이스가 대용량 처리를 위해 분산 구조로 구축되어 있을 때, 우리가 이 데이터를 변경하고 있는 동안에는 남들 시각에서 이 두 데이터는 동시에 변경이 끝나 있든지 어느 쪽도 변경되지 않고 있어야 합니다. 이 데이터를 변경하는 동안에는 다른 스레드나 프로세스에서 동시에 두 데이터 중 어느 하나라도 액세스를 시도할 경우 일단은 기다려야 합니다. 즉, 두 기기에 걸쳐 저장된 레코드를 현재 변경하는 중이라면 그 일이 끝나기 전까지는 기다려야 합니다. 이렇게 기기 둘 이상에 걸쳐 저장된 데이터를 액세스하는 동안 다른 스레드나 프로세스에서 액세스를 블로킹시켜 주는 것을 분산 락(distributed lock)이라고 합니다.