2011-11-07 3 views
4

많은 직원이 고객 불만을 해결하기 위해 시스템에 로그인 할 수있는 응용 프로그램을 작성 중입니다. 한 직원이 불만 사항에 대해 "시작"버튼을 클릭하면 해당 기록이 정지되어야합니다. 얼어서 말하면 다른 직원 화면에 나타나서는 안된다는 뜻입니다. (Ajax를 사용하는 컴퓨터에서 화면이 업데이트 될 때). 또한 특정 시간 동안 만 나타나서는 안됩니다. 직원이 몇 분 안에 불만 사항에 응답하지 않으면 불만 대기열에 다시 나타나야합니다.기록 잠금

이 기간은 어떻게 관리합니까? 사용자가 "시작"을 클릭하고 캐시 객체에 해당 항목을 저장할 수있는 접근법이 하나 있으며 만료일 때까지만 유효합니다. 그런 다음 다른 직원의 화면이 새로 고쳐지면 참석하지 않았으며 캐시에없는 항목 만 표시합니다. 캐시에 있으면 누군가에게 참석한다는 의미입니다. 나는 올바른 길을 가고 있는가? 아니면 그것을하는 더 좋은 방법이 있습니까?

답변

2

당신이 할 수있는 한 가지는 데이터베이스에 '잠금'열이 있고 그 열을 DateTime 열로 유지하는 것입니다.

사용자가 '시작'을 클릭하면 해당 열의 시간을 기록합니다.

표시 할 레코드를 검색 할 때 잠금 열에 null이 아닌 값 또는 잠금 열의 값이 최소 x 분 전인 것을 필터링합니다 (이 값은 GetDate에서 계산을 사용하여 계산할 수 있습니다.) 함수).

+0

니스. 나는 해결책을 좋아했다. 불필요한 타이머 등에 빠지지 않고 읽은 가장 우아한 하나 – Jaggu

2

가장 쉬운 방법은 'RecordStatus'또는 이와 비슷한 항목을 만드는 것입니다.이 값은 특수 값으로 설정하여 생성 또는 수정 중임을 나타낼 수 있습니다.

이렇게하면 모든 쿼리를 수정하여 해당 상태의 레코드를 제외시킬 수는 있지만 장기적으로 모든 유형의 데이터베이스 또는 응용 프로그램 수준의 논리 잠금보다 더 안정적이며 신뢰할 수 있습니다.

+1

그리고 레코드를로드 한 사용자가 레코드를 릴리스하지 않으면 어떻게됩니까? Session_End가 실행되는 것을 보장하지 않는다는 사실을 고려하여 asp.net 앱에서 레코드를 자동으로 해제하도록 데이터베이스에 어떻게 알 립니 까? 귀하의 접근 방식은 올바른 방향으로 가고 있다고 생각합니다. 그러나 더 많은 방법이 있습니다. – Icarus

+0

네, 그게 항상 문제입니다. 우리는 매일 실행되는 일괄 처리 작업을 수행하고 '임시 보관'모드로 남아있는 레코드를보고 핵무기를 숨 깁니다. – kprobst

+0

귀하의 답변은 저에게 영감을주었습니다. 잠금의 시간 기반 만료에 대한 좋은 해결책은 bool 대신에 잠금 열을 DateTime (null 허용)으로 설정하는 것입니다. 그러면 x 분 전에 설정된 null 잠금 또는 잠금을 기반으로 검색 할 수 있습니다. – Jeff

1

우리는 "레코드 잠금"DB 레코드에 대한 몇 가지 변형을 사용하여 독립적으로 두 가지 상황에서 회사에서이를 해결했습니다. 한 시스템에서 레코드가 새 항목으로 "대기열"에 들어갈 때 잠금 레코드가 생성됩니다. 다른 하나는 사용자가 큐에서 레코드를 가져올 때 잠금 레코드가 만들어집니다.

소프트웨어의 사용자 복사본이 작업 대기열 레코드를 열 때 잠금 기록은 사용자에게 기록 된 사용자에 대한 고유 한 식별 정보와 함께 DB에 있어야합니다. 잠금 상태 인 레코드와 레코드 잠금 레벨 (동일한 레벨에있는 두 개의 잠금이 동일한 레코드에 존재할 수 없음을 의미)에서 고유해야하며, 레코드를 연 사용자를 변경 목적으로 "소유"한 것으로 식별해야합니다 . 이 잠금 레코드는 사용자가 자신의 소프트웨어에서 레코드를 연 상태 인 한 계속 유지되어야합니다.

잠금을 "중단"하는 기능은 잠금 장치를 다른 사용자에게 간단히 재 할당하고 원래 잠금 장치의 소프트웨어에 의한 잠금 개체를 정기적으로 폴링하여 수행 할 수 있습니다. 사용자가 더 이상 소유자가 아니면 잠금 장치가 "고장났다"고 사용자가 잠금을 다시 획득하거나 (다른 사용자의 새 잠금을 깨뜨림) 또는 단순히 계속 진행할 수있는 옵션이 있습니다.

사용자의 소프트웨어가 충돌하면 여전히 레코드에 대한 잠금이 설정됩니다. 또한 잠금을 제거하는 작업이 실패 할 수도 있습니다 (실제 데이터가 다른 DB에 있으며 범용 트랜잭션을 적용 할 수없는 상황에서 발생할 수 있음). 이 경우 "고아"잠금을 제거하거나 사용자가 강제로 제거하도록하는 메커니즘이 필요합니다. 잠긴 항목이 시간에 민감한 경우 여러 중복 수준의 잠금 제거를 설계해야합니다 (분당 한 번 X 분보다 오래된 잠금을 해제하거나 "고아"로 알려진 시간이 지정된 작업 일 수 있습니다. 해당 사용자가 더 이상 로그인하지 않은 경우).