2009-11-16 2 views
3

현재 작업중인 응용 프로그램에서 여러 사용자가 동시에 무언가를 편집하여 낙관적 잠금을 구현해야 할 수도 있습니다. 그러나이 응용 프로그램의 경우 편집중인 항목은 데이터베이스의 여러 테이블의 레코드를 포함하는 과학 프로토콜입니다.ASP.NET에서 레코드 잠금 토큰 저장

이와 같이 우리는 단일 사용자가 편집을 위해 전체 프로토콜을 잠 갔음을 나타낼 수 있기를 바랍니다. 이는 내 질문에 이르게합니다. 데이터베이스 수준에서 편집 작업을 수행하는 것이 바람직한 방법입니까? 프로토콜의 고유 ID를 가진 테이블이 있고 잠겨 있는지 확인하십시오) 아니면 메모리에있는 웹 서버 자체에서 현재 잠겨져있는 프로토콜을 추적 할 수 있습니까?

현재 우리는 응용 프로그램에 약 100 명의 사용자 (20 명 정도) 만 예상합니다. 그러나 앞으로 확장 될 수 있으므로 가장 확장 성이 뛰어난 옵션을 사용하려고합니다.

답변

5

이 질문은 실제로 코드베이스가 얼마나 잘 설계되어 있는지에 달려 있습니다.

해당 레코드를 수정하는 모든 호출이 단일 입력 지점을 통과 한 경우 데이터베이스에 멍청한 데이터 저장소를 유지할 수 있도록 모든 잠금 코드를 응용 프로그램에 보관하는 것이 좋습니다.

테이블을 수정할 수있는 항목이 여러 개인 경우 데이터베이스 수준에서 잠금을 구현해야합니다.

+0

우리는 ASP.NET MVC를 사용하고 있으며 모든 프로토콜 편집은 실제로 단일 컨트롤러를 통해 라우팅됩니다. – rjzii

+1

그렇다면 애플리케이션이 스스로 관리하고, Vitaliy과 같은 XML 파일, 데이터베이스 테이블 또는 분산 메모리 캐시 등 어떤 종류의 지속성을 사용하여 잠겨있는 항목을 추적하고 싶습니다. –

+1

이것은 응용 프로그램과 함께 사용 된 경로이므로 허용되는 답변을 얻습니다. 이 질문을 볼 수있는 다른 사람들에게 마일리지는 신청서의 요구 사항에 따라 결정될 수 있습니다. – rjzii

3

나는 잠금을 관리하는 데이터베이스에 테이블을 구현할 것이다.

행 : 예를 들어 주어진 프로토콜은 다음 완성 된 기간이없는 경우 ProtocolID, EditingBeginDate, EditingEndDate 그런

응용 프로그램에서 편집 기능을 시도하고 때 간단하게 조회 할 수 있습니다 당신이 알고 그것을 그 주어진 사용자가 여전히 편집 중입니다. 레코드가 영구적으로 잠기지 않도록 편집 세션을 닫아야하는 특정 시간을 구현할 수 있습니다. 그냥 제안 : - D

+0

나는 실제로 사용자 아이디의 수정과 같은 것을 고려하고 있었다. – rjzii

+0

어떤 완화 된 상황을인지하지 못하는 것을 막을 수있는 확실한 접근법입니다. 이렇게하면 변경 사항을 추적하고 원하는 경우 이전 버전의 프로토콜 스냅 샷을 보관할 수있는 편집 로그가 제공됩니다. – Achilles

+1

+1 나는이 접근 방식을 좋아합니다. 또한이 테이블에 레코드를 쓰는 책임이있는 모듈의 스레딩 코드가 필요하므로 피하려고하는 바로 그 문제로 끝나지 않게됩니다. –

2

그래서, 당신은 거친 자물쇠가 필요해 보인다.

가장 확장 성이 뛰어난 솔루션을 원한다면 데이터베이스 또는 분산 캐시에서 잠금 정보를 유지해야합니다 (이 경우 분산 캐시가 더 빠름). 메모리 내 접근 방식은 확장 성이 전혀 없습니다. 서버가 더 필요할 경우를 대비해 실패 할 것입니다. 가능한 교착 상태를 방지하기 위해 잠금 시간 초과를 도입하는 것도 잊지 마십시오.

+0

낙관적 인 생각과는 달리 비관적 인 이유는 무엇입니까? – rjzii

+1

맞습니다. 낙관적 인 거친 잠금 장치는 없습니다. 그래서 여기서 비관적 인 말은 지나치다. –