2012-03-22 4 views
2

나는 우리가 (last_x, 카운터) 계정에 대한 정보를 수집하는 프로젝트에서 일하고 있습니다. 사용자 작업으로 인해 여러 비즈니스 이벤트가 생성 될 수 있습니다. 웹에서 단일 사용자 조치가 발생하면 둘 이상의 이벤트가 발생하여 USER HISTORY 테이블에 대한 갱신을 트리거합니다.낙천적 인 잠금 장치에 대한 대안이 있습니까

모든 이벤트가 USER HISTORY 테이블로 업데이트되도록 낙관적 잠금을 수행합니다.

문제 : 여분의

낙관적 잠금 결과 읽기 (충돌이 감지되면, 다시 읽고 갱신) 및 (충돌을 해결 한 후) 추가 쓰기. 시도

솔루션 : 사용자 연혁 표 에 삽입에서

  • 모든 이벤트 결과 - 더 히스토리 정보, 가난한 읽기 성능 결과.

다른 대안이 있습니까?

+0

업데이트하는 대신 레코드를 쓸 수 있습니까? 따라서 충돌 가능성이 없습니다. – davidfrancis

+0

쓰기가 발생하면 웹 사이트의 사용자 이벤트와 사용자 기록 테이블의 레코드가 일대일로 매핑됩니다. 카운터 변수와 last_X 변수가있는 테이블이기 때문에. 우리는 최신 기록이 필요합니다. 이는로드하기 전에 모든 이벤트를 정렬해야 함을 의미합니다. 읽기 성능이 떨어지게됩니다. –

+0

즉시 업데이 트하는 것이 중요합니다? – Ben

답변

2

이 테이블에 대한 읽기 성능을 얻으려면이 필요합니까?

일종의 '영업 종료일'/ 매시간 또는 고객 프로필/인텔리전스 테이블처럼 들립니다. 이 경우, 삽입물을 사용하고 데이터웨어 하우싱 기술 (예 : Star Schema)을 사용하여 사물의 (last_x, 카운터) 측면을 검토 할 수 있습니다.

더 중요하고 시간 의존적 인 경우 스키마가 실제로 작동하지 않을 수 있습니다. JMS과 같은 메시징 미들웨어를 사용하여 다른 비즈니스 이벤트를 알리고 트리거하는 것을 고려 했습니까? 이후

당신의 당신이 볼 수있는 오라클을 사용하여 : 토론을 바탕으로 Oracle AS

[편집], 당신은 카운터 정보의 실시간 생산자/소비자 있습니다. 데이터베이스가이 문제를 해결하는 기본 방법이라고 생각하지 않습니다. 당신은 회계 목적을 위해 카운터에 유지해야 할 수도 있습니다,이 같은 아마 뭔가 당신이 필요로하는 무엇을 :

프로듀서 : 초기화
RECV 사용자 작업 X (DB에서 세션/memcached를 재 구축) -> 세션/Memcached가를 (ActionX) + DB에 삽입하십시오.

소비자 : (조건/memcached와, 행위 세션을 확인)

당신은 심지어 사용자의 역사 카운터의 소비자를 만들 수있는 카운터 X에 도달했을 때 생산자에 의해 트리거되는 이벤트에 가입자 수 실행 사용자의 소비자 의존성 제거하기

+0

Datawarehousing은 옵션이 아닙니다. 실시간 데이터가 필요하기 때문입니다. JMS를 사용하여 쓰기를 트리거합니다. 여러 이벤트가있는 경우 동일한 레코드에 동시에 쓰는 것을 트리거합니다. 낙관적 잠금과의 충돌을 해결하지만 과도한 읽기 및 쓰기가 발생합니다. 우리는 그것을 피하고 싶습니다. –

+0

히스토리 테이블을 실시간으로 읽어야합니까? 카운터가 일정 수준에 도달하면 쫓겨날 필요가있는 다른 것이 있습니까? 기본적으로 히스토리 테이블에 기록하고 두 가지 다른 작업을 히스토리 테이블에 적용하고 있습니까? 회계에는 역사가 있어야하지만 카운터가 X에 도달하면 즉시 처리해야하는 항목이 있습니까? –

+0

예, 우리는 변수의 카운터 및 수명에 따라 조치를 취합니다. –

0

여러 개의 이벤트가 서로 다른 경로를 따르고 각 이벤트가 기록 레코드를 생성하는 것처럼 들립니다. 그 맞습니까?

응용 프로그램이 이벤트를 제어 할 수 없으며 다른 경로를 따라 동일한 이벤트를 표시해야합니까? 어쩌면 모든 이벤트에 대해 고유 한 ID를 생성하고 DB에서 필드를 고유하게 작성하여 쓰기가 실패 할 수도 있습니다.고유 한 제한 조건으로 인해 쉽게 실패를 무시할 수 있습니다.

+0

예. 다른 이벤트는 다른 경로를 따릅니다. 그래서 그들은 다른 것을 전혀 모릅니다. 예, 재시도 논리가 있지만 읽기 및 쓰기가 많습니다. 우리는 그 시나리오를 피하려고 노력하고 있습니다. –

+0

그런 경우 왜 각 이벤트에 대해 고유 식별자를 생성하고 그 식별자를 해당 이벤트의 모든 복제에 전달할 수 없습니까? 이 경우 DB는 고유 한 제약 조건을 처리하기 만합니다 (동일한 ID로 여러 개의 쓰기를 무시하여 스키마에서 이벤트 ID에 고유 한 제약 조건을 적용 할 수 있다고 가정). – uaarkoti

+0

이벤트 ID가 고유 키의 일부이면 고유 제한 조건 위반을 피할 수 있습니다. 그러나 이벤트 A가 이벤트 B가 작성되기 전에 DB에서 읽으면 어떻게됩니까? 이 경우 이벤트 A는 오래된 정보를 업데이트하고 기록 할 때 이벤트 ID로 인해 고유 한 제한 사항이 실패하지 않으므로 이벤트 B의 정보가 손실됩니다. –

관련 문제