2009-11-09 12 views
0

들어오는 파일을받을 때마다 하나의 테이블을 채우도록 저장 프로 시저를 호출했습니다. 가끔씩 우리는 하나 이상의 파일을 받고 프로 시저가 동시에 호출됩니다. 아래로 프로 시저 내부 이 문장은 매우 간단하다 :교착 상태를 해결하십시오

IF NOT EXISTS (SELECT.... WHERE A=1 B=2) 
    INSERT ... 
ELSE 
    UPDATE ... 
    WHERE A=1 and B=2 
END 

는 이렇게, 나는 중복 기록 오류를 받기 시작했다. 2 개의 동일한 레코드가 INSERT에 시도되었다고 가정합니다. 이를 피하기 위해 나는이 진술을 SERIALIZABLE ISOLATION LEVEL으로 거래 내역에 넣었습니다.

상황이 더욱 악화되어 교착 상태 오류가 발생하기 시작했습니다.

내가 잘못하고있는 것이 있습니까?

답변

0

격리 수준을 읽기 전용으로 변경하십시오.

Serializable은 슈퍼 빅 트랜잭션 해머입니다. 수정되었지만 확약되지 않은 데이터를 다른 프로세스가 읽지 못하도록합니다. sp의 2 단계 프로세스와 결합하면 교착 상태가 발생합니다. 자세한 내용은

확인이 아웃 : http://msdn.microsoft.com/en-us/library/ms173763.aspx

+0

기본 수준 인 Read Committed를 시도했습니다. 하지만 여전히 중복 된 레코드 오류가 발생합니다. – wixuser1105

+0

커밋되지 않은 읽기 권한을 부여합니다. 앤드류의 대답을 변경하는 것은 확실히 문제를 해결할 것입니다. –

1

성능이 다음 건축가에게 메시지 큐를 사용하는 솔루션을 다시 시도 할 수 격리 수준을 변경하여 문제가 될 경우.

파일이 와서 :

  1. 전화 메시지 큐에 파일을 추가하는 SP.
  2. 대기열에서 메시지를 하나씩 꺼내어 처리하는 예약 된 작업으로 실행하는 별도의 SP를 준비하십시오 (자동 증분 PK가있는 테이블 사용). - 교착 상태를 피하십시오.
관련 문제