문제

두 가지 방법이 노출된 WCF 서비스가 있습니다.

메모:wcf 서비스와 SQL Server는 동일한 시스템에 배포됩니다.SQL Server에는 직원 정보를 유지 관리하는 직원이라는 테이블이 하나 있습니다.

  1. Read() 이 메서드는 SQL Server에서 모든 직원을 검색합니다.
  2. Write() 직원 테이블의 직원 정보를 SQL Server에 기록(추가, 업데이트, 삭제)하는 메소드입니다.

이제 저는 모든 클라이언트가 웹 서비스를 사용하여 직원 정보를 쿼리, 추가, 업데이트 및 삭제할 수 있는 데스크톱 기반 애플리케이션을 개발했습니다.

질문:

여러 클라이언트가 동시에 직원 정보를 업데이트하려는 경우 시나리오를 어떻게 처리할 수 있습니까?SQL Server 자체가 데이터베이스 잠금을 사용하여 이를 처리합니까??

가장 좋은 방법을 제안해주세요 !!

도움이 되었습니까?

해결책

일반적으로 연결이 끊긴 환경에서는 낙관적 동시성rowversion/timestamp 선호되는 접근 방식입니다.WCF 하다 분산 트랜잭션을 지원하지만 이는 시스템에 긴 차단을 도입하는 좋은 방법입니다.대부분의 ORM 도구는 다음을 지원합니다. rowversion/timestamp 상자 밖으로.

물론, 섬기는 사람 트랜잭션(연결 기반 또는 TransactionScope) 개별 저장소 방법을 "ACID"로 만들려고 하지만 가능한 한 유선상의 트랜잭션을 피하려고 노력할 것입니다.


댓글 다시;미안해요. 솔직히 그 댓글은 못 봤어요.한 번에 많은 댓글을 받으면 stackoverflow가 이를 쉽게 만들지 못하는 경우가 있습니다.여기에는 두 가지 다른 개념이 있습니다.대기는 차단의 증상이지만 동일한 레코드를 업데이트하는 클라이언트가 100개인 경우 각 트랜잭션 중에 차단하는 것이 전적으로 적절합니다.작업을 단순하게 유지하려면 다음을 수행하세요.병목 현상(추가 작업 필요)을 입증할 수 없다면 다음과 같이 시작하겠습니다. 직렬화 가능 업데이트 작업에 대한 트랜잭션(TransactionScope 기본적으로 이것을 사용합니다).그렇게 하면 그렇습니다:대부분의 시나리오에 대해 적절한 차단(ACID 등)이 발생합니다.

하지만;두 번째 문제는 동시성입니다.동일한 레코드에 대해 100개의 업데이트를 받는 경우 어느 것을 신뢰할지 어떻게 알 수 있나요?대부분의 시스템에서는 첫 번째 데이터에 대한 오래된 가정을 바탕으로 작업하므로 업데이트하고 나머지는 삭제합니다.타임스탬프/행 버전이 들어오는 곳입니다.UPDATE 문에 "타임스탬프/행 버전이 일치해야 함"을 적용하면 사용자가 스냅샷을 만든 이후 변경되지 않은 데이터만 업데이트할 수 있습니다.이를 위해 rowversion을 다른 버전과 함께 유지하는 것이 일반적입니다. 흥미로운 업데이트 중인 데이터.

다른 팁

또 다른 대안은 WCF 서비스를 싱글톤(InstanceContext.Single)으로 인스턴스화할 수 있다는 것입니다. 이는 해당 서비스의 인스턴스가 하나만 실행된다는 의미입니다.그런 다음 업데이트 잠금을 위해 메모리에 간단한 개체를 유지하고 해당 개체를 기반으로 업데이트 메서드를 잠글 수 있습니다.다른 세션에서 업데이트 호출이 들어오면 잠금이 해제될 때까지 기다려야 합니다.

안부 스티브

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top