증상
다음과 같은 경우를 생각해 볼 수 있습니다.
-
Microsoft SQL Server 2008 R2에 ALLOW_SNAPSHOT_ISOLATION 옵션이 있고 READ_COMMITTED_SNAPSHOT 활성화 되어 있는 데이터베이스가 있습니다.
-
데이터베이스의 테이블에 대해 TABLOCK 및 UPDLOCK 힌트를 포함 하는 SELECT 문을 실행 합니다.
-
SELECT 문은 명시적 시작 TRAN에 래핑되어 있지만 COMMIT TRAN 은 실행 되지 않습니다.
-
동일한 쿼리 힌트를 사용 하 여 시작 되는 두 개 이상의 쿼리는 명시적 트랜잭션에 있습니다.
이 시나리오에서 첫 번째 쿼리가 커밋되면 다른 쿼리 중 하나가 교착 상태가 됩니다.
원인
이 문제는 SQL Server가 다음 시나리오 중 하나에서 교착 상태를 잘못 보고 하기 때문에 발생 합니다.
-
데이터베이스에 대해 ALLOW_SNAPSHOT_ISOLATION 및 READ_COMMITTED_SNAPSHOT 을 사용 하는 경우 동일한 트랜잭션에 대해 여러 쿼리가 완료 되 면 교착 상태가 잘못 된 것으로 보고 될 수 있습니다.
-
ALLOW_SNAPSHOT_ISOTION 를 사용 하 고 힌트 TABLOCK 및 UPDLOCK 를 사용 하는 경우 second 및 세째 SELECT 문은 X로 변환할 목적으로 IX 잠금을 사용 합니다. X로 변환 하려고 하면 IX 잠금이 교착 상태를 종료 합니다.
-
ALLOW_SNAPSHOT_ISOLATION 을 사용 하지 않도록 설정한 경우 두 번째 및 세 번째 쿼리는 6 개의 잠금을 가져옵니다. 이 상황에서 6 개의 잠금이 X로 변환 되 면 교착 상태에 해당 되지 않고 블로킹 시나리오 일 수 있습니다.
해결 방법
이 문제는 다음 SQL Server 누적 업데이트에서 처음 수정 되었습니다. 핫픽스를 적용 한 후에 SQL Server는 데이터베이스와 쿼리에 대해 READ COMMIT 힌트 또는 NOLOCK 힌트가 발견 되 면 기록 하 여 문제를 해결 합니다. 이 정보는 교착 상태를 잘못 보고 하는 대신 올바른 잠금 유형을 선택 하 여 상황을 올바르게 처리 하는 데 사용 됩니다.
SQL Server 2008 R2 SP2에 대 한 누적 업데이트 11 /en-us/help/2926028
각각의 새로운 새 누적 업데이트에는 이전 누적 업데이트에 포함 된 모든 핫픽스와 모든 보안 수정 사항이 포함 되어 있습니다. SQL Server에 대 한 최신 누적 업데이트를 확인 하세요.
상태
Microsoft는 "적용 대상" 절에 나열한 제품에서 이 문제를 확인했습니다.