영업: 1-800-867-1380

Azure 관리 캐시 서비스의 동시성 모델

업데이트 날짜: 2010년 7월

note참고
응용 프로그램에 대한 올바른 Azure 캐시 제품 선택에 대한 자세한 지침은 내게 적합한 Azure 캐시 기능를 참조하세요.

캐싱 아키텍처를 사용하면 캐시 클라이언트에 적절한 네트워크 액세스와 구성 설정이 있는 경우 해당 클라이언트가 캐시된 데이터에 액세스할 수 있습니다. 따라서 동시성 문제가 나타납니다.

응용 프로그램의 동시성 문제를 처리하는 데 도움이 되도록 낙관적/비관적 동시성 모델이 모두 지원됩니다.

낙관적 동시성 모델에서는 캐시된 개체에 대한 업데이트가 잠기지 않습니다. 대신 캐시 클라이언트가 캐시에서 개체를 가져올 때 해당 개체의 현재 버전도 가져와 저장합니다. 업데이트가 필요하면 캐시 클라이언트에서 개체의 새 값을 저장된 버전 개체와 함께 보냅니다. 전송된 버전이 캐시에 있는 현재 개체 버전과 일치하는 경우에만 시스템에서 개체를 업데이트합니다. 개체에 대한 모든 업데이트는 해당 버전 번호를 변경하므로 다른 사용자의 변경 내용을 덮어쓰지 않습니다.

이 항목의 예제에서는 낙관적 동시성이 데이터 일관성을 유지하는 방법에 대해 설명합니다.

다음 예제에서 두 개의 캐시 클라이언트(cacheClientAcacheClientB)는 동일한 키 RadioInventory가 포함되어 있는 캐시된 동일 개체를 업데이트하려고 합니다.

시간 0: 두 클라이언트가 모두 동일한 개체 검색

시간 0(T0)에서 두 캐시 클라이언트가 모두 DataCacheItem 클래스를 인스턴스화하여 업데이트하려는 캐시된 개체를 버전 및 태그 정보 등의 캐시된 해당 개체에 연결된 추가 정보와 함께 캡처합니다. 다음 코드 예제에 그 방법이 설명되어 있습니다.

//cacheClientA pulls the FM radio inventory from cache
string strACSKey = "[Authentication token]";
DataCacheSecurity clientAFactorySecurity = new DataCacheSecurity(strAcsKey);

DataCacheFactoryConfiguration clientAFactoryConfiguration = new DataCacheFactoryConfiguration();
// Set up desired parameters for Cache Factory
clientAFactoryConfiguration.SecurityProperties = clientAFactorySecurityDataCacheFactory;

clientACacheFactory = new DataCacheFactory(clientAFactoryConfiguration);
DataCache cacheClientA = clientACacheFactory.GetCache("catalog");
DataCacheItem radioInventoryA = 
    cacheClientA.GetCacheItem("RadioInventory");

//cacheClientB pulls the same FM radio inventory from cache
// clientBFactorySecurity and clientBFactoryConfiguration omitted for space
DataCacheFactory clientBCacheFactory = new DataCacheFactory();
DataCache cacheClientB = clientBCacheFactory.GetCache("catalog");
DataCacheItem radioInventoryB= 
    cacheClientB.GetCacheItem("RadioInventory");

note참고
이 예제에서는 GetCacheItem 메서드를 사용해 버전 정보를 가져와서 DataCacheItem 개체를 검색하지만 Get 메서드를 사용해 검색된 캐시 항목과 연결된 DataCacheItemVersion 개체를 가져올 수도 있습니다.

시간 1: 첫 번째 업데이트 성공

시간 1(T1)에서 cacheClientA는 캐시된 개체 RadioInventory를 새 값으로 업데이트합니다. cacheClientAPut 메서드를 실행하면 RadioInventory 캐시 항목과 연결된 버전이 증분됩니다. 이때 cacheClientB에는 오래된 캐시 항목이 포함되어 있습니다. 다음 예제에 그 방법이 설명되어 있습니다.

//at time T1, cacheClientA updates the FM radio inventory
int newRadioInventoryA = 155;

cacheClientA.Put("RadioInventory", newRadioInventoryA, 
    radioInventoryA.Version);

시간 2: 두 번째 업데이트 실패

시간 2(T2)에서 cacheClientB는 이제 오래된 버전 번호를 사용하여 RadioInventory 캐시된 개체를 업데이트하려고 합니다. cacheClientA의 변경 내용을 덮어쓰지 않도록 하기 위해 cacheClientBPut 메서드 호출에 실패합니다. 캐시 클라이언트에서는 ErrorCode 속성이 CacheItemVersionMismatch로 설정된 DataCacheException 개체를 발생시킵니다. 다음 코드 예제에 그 방법이 설명되어 있습니다.

//later, at time T2, cacheClientB tries to 
//update the FM radio inventory, receives DataCacheException with
//an error code equal to DataCacheErrorCode.CacheItemVersionMismatch.
int newRadioInventoryB = 130;

cacheClientB.Put("RadioInventory", newRadioInventoryB,
    radioInventoryB.Version);

비관적 동시성 모델에서는 클라이언트가 개체를 명시적으로 잠근 상태에서 작업을 수행합니다. 잠금을 요청하는 다른 작업은 잠금이 해제될 때까지 거부됩니다(시스템이 요청을 차단하지는 않음). 개체가 잠기면 잠금 핸들이 출력 매개 변수로 반환됩니다. 개체의 잠금을 해제하려면 잠금 핸들이 필요합니다. 잠긴 개체가 해제되기 전에 클라이언트 응용 프로그램이 종료될 경우 잠금을 해제하기 위한 시간 제한이 제공됩니다. 잠긴 개체는 만료되지 않지만 만료 시간이 경과되면 잠금 해제된 직후에 만료될 수 있습니다.

비관적 동시성 모델에서 사용되는 메서드에 대한 자세한 내용은 동시성 메서드를 참조하세요.

note참고
여러 작업에 걸친 트랜잭션은 지원되지 않습니다.

note참고
캐시를 사용하는 응용 프로그램은 잠금 순서를 결정하고 교착 상태(해당하는 경우)를 검색합니다.

Warning경고
캐시의 잠긴 개체는 캐시 클라이언트에서 Put 메서드를 사용하여 계속 바꿀 수 있습니다. 캐시 사용 응용 프로그램은 비관적 동시성 모델을 사용하는 항목에 일관적으로 PutAndUnlock을 사용합니다.

참고 항목

이 정보가 도움이 되었습니까?
(1500자 남음)
의견을 주셔서 감사합니다.
표시:
© 2014 Microsoft