3

나는 다음을 수행하는 여러 스레드에서 호출하는 프로세스가 :스냅 샷 격리 모드에서 READPAST를 사용할 수 없습니다

  1. 시작 트랜잭션
  2. 선택 작업 테이블에서 작업 단위로 다음 행 곳을 찾아
  3. 트랜잭션을 커밋 힌트 (UPDLOCK, HOLDLOCK, READPAST)
  4. 프로세스 작업 (C# 및 저장 프로 시저 SQL)의 유닛 = 0 IsProcessed
01,

이 아이디어는 "다음"작업을 위해 풀에 스레드가 잠겨서 처리하는 것이며 잠금은 단일 작업이 두 번 처리되지 않도록하기위한 것입니다. (순서는 중요하지 않음).

이 모든 기능은 몇 달 동안 잘 작동합니다. 지금까지는 스냅 숏 격리를 활성화하고 데이터베이스 수준에서 기본값으로 설정 했음에도 불구하고 실제 트랜잭션 생성 코드가 격리 수준 인 "ReadCommitted"를 수동으로 설정하고 있음을 깨닫게되었습니다.

정식으로 "Snapshot"으로 변경했으며 물론 "READ COMMITTED 또는 REPEATABLE READ에서 READPAST 잠금 만 지정할 수 있습니다."라는 오류 메시지가 즉시 나타납니다. 죄송합니다.

행을 잠그는 주된 이유는 마크를 적용한 트랜잭션이 커밋되고 잠금이 가장 좋은 방법 인 것처럼 보일 때 "마크"가 제거되는 방식으로 "행을 마크"하는 것이 었습니다 이 스레드는이 테이블을 제외하고는이 테이블을 읽지 않으므로이 테이블은 읽히지 않습니다. 잠금 장치로 IsProcessed 플래그를 사용한다면 아마도 업데이트를 먼저 수행 한 다음 방금 업데이트 한 행을 선택해야 할 것입니다. 그러나 다른 스레드가 설정했는지 여부를 알기 위해 NOLOCK 플래그를 사용해야합니다. 행에 플래그.

모든 소리가 약간 지저분합니다. 가장 쉬운 옵션은 스냅 샷 격리 모드를 포기하는 것이지만 3 단계의 설계에는 스냅 샷 격리 모드가 필요합니다.

이 문제를 해결하는 가장 좋은 방법에 대한 아이디어가 있으십니까?

감사

마커스

답변

1

변화 (귀하의 경우는 스냅 샷 모드에서 동작하도록 디폴트있다) 최선을 다하고 기본 읽기 이외의 특정 트랜잭션의 격리 수준. 그런 다음 스냅 샷의 데이터베이스에 다른 작업을 남겨 둘 수 있지만 코드의이 특정 워크 플로는 스냅 샷 이외의 다른 워크 플로입니다.