다음을 통해 공유


데이터 동시성 관리

WCF RIA Services에는 데이터 일관성을 보장하기 위해 낙관적 동시성이 지원되며, 개발자는 데이터 원본을 업데이트할 때 발생할 수 있는 잠재적인 충돌을 해결하기 위한 논리를 제공해야 합니다. 사용자가 데이터를 업데이트하거나 삭제할 수 있도록 할 때는 데이터 레코드에서 무조건 값을 업데이트하거나 레코드에서 삭제하기 전에 데이터 원본에 있는 데이터가 다른 프로세스로 변경되지 않았는지 확인해야 합니다. 값이 변경되었는지 여부를 확인하지 않는 경우 다른 프로세스에서 설정한 값을 실수로 덮어쓸 수 있으며 데이터가 일관성이 없는 상태가 될 수 있습니다. 낙관적 동시성에서는 그러한 충돌이 거의 발생하지 않을 것으로 가정하지만 데이터 원본에서 가져온 값을 현재 원본에 있는 값과 비교하여 변경되었거나 삭제되었는지 확인합니다. 값이 일치하지 않으면 OptimisticConcurrencyException이 발생하며, 이 예외를 처리해야 합니다.

값 일관성 검사를 지정하는 방법에 대한 절차는 방법: 낙관적 동시성 검사 사용을 참조하십시오. 일관성 보증을 위해 명시적 트랜잭션을 사용하는 방법에 대한 자세한 내용은 방법: 도메인 서비스에 명시적 트랜잭션 추가를 참조하십시오.

동시성 특성 사용

기본적으로 RIA Services 는 데이터 동시성을 확인하기 위해 전체 원본 엔터티를 변경된 값과 함께 데이터 액세스 레이어에 전달하지 않습니다. 대신 RIA Services 는 RoundtripOriginalAttribute 특성, ConcurrencyCheckAttribute 특성 또는 TimestampAttribute 특성으로 표시된 멤버만 저장하고 다시 전달합니다.

이러한 각 특성은 Entity Framework를 사용할 경우 메타데이터 클래스의 속성 또는 메타데이터 클래스 자체에 적용할 수 있습니다. 또한 POCO 정의 데이터 모델을 사용할 경우 CLR 형식의 속성 또는 클래스에 직접 적용할 수도 있습니다. 자세한 내용은 방법: 메타데이터 클래스 추가를 참조하십시오. 이러한 특성을 적용한 후 빌드하면 속성 또는 클래스에 대해 클라이언트에서 생성된 코드에 해당 특성이 표시됩니다. 클래스의 속성 대신 클래스에 특성이 적용된 경우는 특성을 클래스의 모든 멤버에 적용한 것과 동일합니다. ConcurrencyCheckAttributeTimestampAttribute 특성을 사용하면 도메인 서비스 메타데이터에 적용된 클라이언트 속성 또는 클라이언트에 RoundtripOriginalAttribute가 표시될 수도 있습니다. 이 구현에서는 동시성 확인에 포함할 멤버만 지정하여 응용 프로그램의 성능을 최적화할 수 있습니다. 자세한 내용은 다음을 참조하십시오.

[!참고] KeyAttribute가 엔터티 형식의 속성에 적용된 경우에는 프로젝트가 빌드될 때 클라이언트에서 생성된 해당 속성에도 RoundtripOriginalAttribute가 추가됩니다. 따라서 새 도메인 서비스 클래스 추가 마법사를 사용하여 데이터베이스 원본으로부터 생성된 도메인 서비스에서는 이러한 동작이 엔터티 키로 작동하는 속성의 기본 동작입니다.

RoundtripOriginalAttribute가 적용된 경우 데이터 액세스 계층은 데이터가 검색되었을 때 기록된 데이터 원본의 원래 값을 데이터 원본에 있는 데이터의 현재 값과 비교합니다. 값이 동일하면 저장소에 있는 데이터가 변경되지 않은 것이고, 데이터 액세스 레이어에서 데이터를 업데이트하거나 삭제합니다. 데이터가 변경된 경우에는 충돌이 발생하고 OptimisticConcurrencyException이 발생합니다. 충돌에 대한 정보는 더 이상 현재 데이터를 포함하지 않는 엔터티의 EntityConflict 속성에 저장됩니다.

클라이언트에서 업데이트하거나 삭제할 수 있는 엔터티의 멤버에 ExcludeAttribute 특성을 적용하는 경우 해당 멤버를 낙관적 동시성 검사에 사용할 수 없습니다. 멤버를 제외하면 해당 멤버에 대해 올바른 원래 값이 저장되지 않으며 따라서 항상 업데이트 작업이 실패합니다. 자세한 내용은 방법: 메타데이터 클래스 추가를 참조하십시오.

OptimisticConcurrencyException 처리

개체 캐시의 데이터 변경 내용이 캐시에 개체를 추가하거나 캐시에서 새로 고친 후 데이터 원본에서 수행된 변경 내용과 충돌할 경우 전체 트랜잭션이 롤백됩니다. OptimisticConcurrencyException이 발생하면 이를 처리하기 위해 개체 데이터에 있는 데이터를 보존하여 충돌을 해결하거나(ClientWins) 데이터 원본의 데이터로 개체 캐시를 업데이트하여 충돌을 해결할지를(StoreWins) 지정해야 합니다. 이렇게 하는 방법에 대한 자세한 내용은 변경 내용 저장 및 동시성 관리를 참조하십시오.