2012-02-19 2 views
0

VS + SQL Server 2008에서 프로그램을 만들고 LAN을 통해 연결된 3 대의 컴퓨터로 구성된 홈 네트워크에서 시작했습니다. 프로그램은 데이터베이스에서 데이터를 가져 와서 데이터 세트에 넣으므로 사용자는 데이터 세트에 대한 작업 및 데이터 세트의 업데이트, 삭제 또는 추가는 데이터베이스를 업데이트합니다. 데이터베이스가 동일한 앱을 실행중인 PC (서버) 중 하나에 있고 다른 두 대의 PC가 클라이언트 일 뿐이며 서버 데이터베이스에서 데이터를 가져옵니다.서버 데이터베이스가 변경 될 때 클라이언트 업데이트

내 문제는 한 PC에서 다른 PC가 해당 업데이트를 모르는 데이터베이스를 업데이트 할 때입니다. 예를 들어 한 사용자가 항목을 삭제하고 다른 사용자가 같은 항목을 삭제하면 오류가 발생합니다.

내 질문은 분명합니다 : 데이터베이스의 변경으로 모든 PC를 업데이트 할 수 있습니까?

하나는 각 응용 프로그램이 서버의 SQL 서버 데이터베이스와 만 대화하고 다른 PC의 다른 Apps와는 이야기하지 않습니다.

답변

1

이것은 일반적인 문제이며 낙관적 인 동시성 검사 (일반적으로 사용자가 삭제/업데이트하려고 시도하지만 행이 만료되면 실패하게 함)에 의해 일반적으로 처리됩니다 (요즘).

낙관적 동시성의 기본 패턴은 각 행에 rowversion 열을 갖는 것입니다. UPDATE를 수행하기 전에 메모리 내의 rowversion을 서버 rowversion과 비교하십시오. 일치하지 않으면 다른 사람이 행을 업데이트 했으므로 다시로드해야합니다. DELETE의 경우 개인적으로는 그냥 자동으로 DELETE에 실패합니다. 사용자가 행을 삭제하려면 사전에 삭제했는지가 중요합니다.

또 다른 패턴은 비관적이며 기본적으로 사용자가 작업하는 동안 행을 잠급니다. 이것은 서버 자원의 분명한 단점을 가지고 있으며, 사용자는 기계에서 멀리 떨어지는 사람이지만 SQL Server 잠금 (예 : FOR UPDATE, 트랜잭션) 또는 응용 프로그램 수준 잠금 (예 : 공유 데이터베이스 테이블 검사)을 사용하여 구현할 수 있습니다.

MS SQL Server를 사용하면 다른 편리한 옵션 인 SqlDependency을 사용할 수 있습니다. 이렇게하면 쿼리 결과가 변경된 시점 (데이터를 다시로드 할 수있는 시점)에 SQL Server가 이벤트 처리기를 통해 사용자에게 알릴 수 있습니다. 상상할 수 있듯이 일부 서버 리소스가 필요하지만 중간 계층이없는 클라이언트가 3 개인 경우 이상적입니다.

+0

감사합니다. 실제로 큰 프로젝트이며 3 개 이상의 클라이언트가 포함되어 있으며 중간 계층을 포함하고 있습니다. SqlDependency를 확인 하겠지만 질문이 있습니다. 어떤 대기업이 그런 경우에합니까? 가장 의미있는 방식은 무엇입니까? ?? –

+0

@alihaider - 요구 사항에 따라 다릅니다. 연결된 시나리오에서 작업하는 경우 (일반적으로 사용자가 생각하는 것처럼), 일반적으로 DB에서 대량의 데이터 세트를 가져올 필요가 없습니다. 이렇게하면 대부분 (다른 클라이언트가 일반적으로 데이터베이스의 다른 행/테이블에서 작업하고 있음) 문제를 피한 다음 낙관적 인 동시성이 희소 한 충돌을 처리합니다. 중간 계층을 사용하는 경우 중간 계층에서 데이터를 캐시하고 업데이트가 발생할 때 캐시를 무효화하거나 (SqlDependency 사용) 업데이트 된 정보를 클라이언트에 배포 할 수 있습니다 (폴링, long-polling, 콜백, 원격 이벤트 등) –

+0

많은 POS 클라이언트가있는 재고 시스템입니다 ... 어떻게 생각하니? –

관련 문제