2012-02-10 5 views
1

먼저 INSERT를 수행 한 다음 특정 행에서 UPDATES를 수행하는 복잡한 저장 프로 시저가 있습니다. 사용자 2가 동일한 SP를 조회하고 일부 SELECTS가 UPDATES 대신 발생해야하는 경우이 요청 완료 후 이상적입니다. 하나 이상의 요청이 동시에 발생하면, 우리는 자연스럽게 그 UPDATE에 교착 상태를 갖습니다.WAITFOR SQL의 동시성 문제

우리는 WA가 시작하기 전에 전역 임시 테이블에 플래그를 먼저 설정하고 두 번째 요청이 오면 다시 시도하기 위해 잠시 기다려야하므로 10 초 후에 다시 시도하고 업데이트가 완료된 것으로 확인되면 SELECT 로직으로 완전히 건너 뛸 수 있습니다. 이 방법으로 우리는 사용자가 교착 상태에 빠질 것이라고 느끼지 않습니다. 5 ~ 10 초 후에 결과가 궁극적으로 반환됩니다.

WAITFOR를 사용하면 향후 문제가 발생할 수 있습니다.

답변

0

이것은 매우 위험한 아이디어입니다. 데이터베이스에 이미 레코드를 삽입하고 업데이트 할 수있는 많은 기능이 이미 있습니다. 트랜잭션과 힌트를 사용하여 교 x 상태의 위험을 줄일 수 있습니다. 부적절한 인덱싱으로 인해 많은 양의 교착 상태가 발생할 수 있습니다.

SQL proc에서 스핀 록을 구현하는 것은 일반적으로 잘못 될 것입니다.

잠시 뒤에 사용할 수있는 패턴에 대해 블로그에 올린 사람 : http://samsaffron.com/archive/2008/08/27/Deadlocked+