1

저는 내 애플 리케이션을위한 Azure 모바일 서비스 백엔드가 있습니다. 나는 MSSQL을 매우 사치스럽게 사용합니다. 그러나 이론적으로 동시에 동일한 객체에 액세스 할 수있는 여러 클라이언트가 있습니다. 나를위한 적절한 해결책은 Optimistic Locking을 사용하여 더 이상의 동시성 문제를 피하는 것입니다.Azure 모바일 서비스에서 낙관적 인 잠금을 구현하는 방법은 무엇입니까?

제 질문은 이것입니다. 백엔드에서 채워지는 타임 스탬프가 있습니다. 내 질문은 거기에 프로세스에서 항목의 "이전 버전"을 가져 오는 처리하는 깔끔한 방법이 있는지 또는 수동으로 데이터베이스에서 개체를 쿼리 할 수 ​​있습니다 - 또는 여부를 쉽게 비슷한 쿼리에서 날짜 제약 조건을 통합 할 수 있습니다.

function update(item, user, request) { 
    query.where... 
    request.execute(); 
} 

하지만 업데이트에 쿼리가 없습니까? 성능이 내 애플 리케이션에 대한 중요한 쿼리를 많이 기대하고있다.

답변

0

낙관적 잠금은 실제로 웹에 적합하지 않습니다. 읽기 및 업데이트 작업은 상태를 저장하지 않으며 독립적 인 요청의 일부입니다 (HTTP를 닦는 것이 좋습니다).

각 요청에서 트랜잭션을 사용할 수 없다는 것은 아닙니다 (mssql 개체 http://msdn.microsoft.com/en-us/library/windowsazure/jj554212.aspx 참조). 그러나 기본적으로 분산 된 웹 응용 프로그램에서 여러 요청에 트랜잭션을 도입하는 것은 일반적으로 잘못된 아키텍처 결정입니다. (CAP 정리를 보라).

Azure Queues와 명령 및 이벤트와 같은 메시지를 사용하여 트랜잭션 또는 "sagas"를 시뮬레이션하여 데이터베이스의 새로운 상태를 변경하여 사용자가 레코드를 잠금을 관리 할 수 ​​있습니다. 또는 단순히 기존 테이블에 대한 레코드 잠금을 관리 할 다른 테이블을 가질 수 있습니다. 어느 쪽이든, 읽기와 업데이트가 서로 다른 요청이며 상태 비 저장 웹과 분산 컴퓨팅의 본질이기 때문에 애플리케이션 로직에 명시 적으로 레코드 잠금을 설정해야합니다.

관련 문제