여러 프로세서가 동일한 레코드를 검색하기 때문에 주문 처리 시스템에 경합 상태가 발생했습니다. 이 문제를 해결하는 방법은 다음과 같습니다.
문제 이해:
문제는 저장 프로시저에서 별도로 잠긴 뷰의 선택 항목과 결합된 ROWLOCK
힌트를 사용하는 데서 발생합니다. 이로 인해 여러 프로세서가 동일한 기록을 잠가서 데이터가 손상될 수 있습니다.
힌트를 사용한 해결 방법:
경합 상태를 해결하려면 READPAST
및 UPDLOCK
힌트를 사용하세요.
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) OrderTable foo SET ProcessorID = @PROCID FROM foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0 COMMIT TRAN SELECT OrderID, ProcessorID, etc... FROM OrderTable WHERE ProcessorID = @PROCID</code>
READPAST
은 선택 중에 행이 잠기는 것을 방지하여 지속적인 쿼리 실행을 보장합니다. UPDLOCK
업데이트 중 적절한 잠금을 보장하여 동시 수정을 방지합니다.
더 효율적인 솔루션:
보다 간소화된 접근 방식은 OUTPUT
절을 사용하여 SELECT
및 UPDATE
작업을 결합합니다.
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) foo OUTPUT OrderID, ProcessorID, etc... SET ProcessorID = @PROCID FROM foo WITH (ROWLOCK, UPDLOCK, READPAST) WHERE ProcessorID = 0 COMMIT TRAN</code>
이렇게 하면 별도의 SELECT
문이 필요하지 않아 효율성과 코드 명확성이 향상됩니다.
위 내용은 중복 레코드 검색으로 인해 주문 처리 시 SQL Server 경합 상태를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!