주문 처리 시 SQL Server 경합 조건 해결
이 문서에서는 저장 프로시저를 통해 주문 대기열에 액세스할 때 여러 주문 프로세서가 경쟁 조건에 직면하는 일반적인 문제를 다룹니다. 저장 프로시저는 고유 ID를 사용하여 처리를 위해 다음 20개 주문을 잠급니다. 그러나 동시 액세스로 인해 여러 프로세서가 동일한 주문을 요구하게 되어 처리 오류가 발생할 수 있습니다.
근본 원인은 커밋되지 않은 트랜잭션의 가시성입니다. 일반적으로 동시 행 액세스를 방지하는 ROWLOCK
을 사용하더라도 커밋되지 않은 변경 사항은 잠금을 확인하는 다른 프로세서에 표시되지 않습니다. 이로 인해 경쟁 조건이 발생합니다.
해결 방법은 READPAST
및 UPDLOCK
문에 SELECT
및 UPDATE
힌트를 사용하는 것입니다. READPAST
커밋되지 않은 업데이트로 인한 간섭을 피하기 위해 잠긴 행을 우회하도록 데이터베이스에 지시합니다. UPDLOCK
트랜잭션이 커밋될 때까지 업데이트된 행에 배타적 잠금을 보장하여 다른 프로세서가 해당 행을 수정하지 못하도록 합니다.
이러한 힌트를 통합한 개선된 코드는 다음과 같습니다.
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) foo SET ProcessorID = @PROCID FROM OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0 COMMIT TRAN SELECT OrderID, ProcessorID, etc... FROM OrderTable WHERE ProcessorID = @PROCID</code>
효율성을 높이려면 OUTPUT
절을 사용하는 것이 좋습니다. 이는 SELECT
및 UPDATE
작업을 병합하여 단일 단계로 테이블을 업데이트하고 수정된 행을 반환합니다. 이렇게 하면 별도의 SELECT
문
위 내용은 주문 처리 대기열에서 SQL Server 경합 상태를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!