2011-10-31 2 views
0

같은 테이블에 배치 삽입을 수행하는 동안 테이블에 대한 SQL 쿼리를 처리하는 방법과 관련하여 질문이 있습니다.일괄 삽입을 수행하는 동안 select 쿼리를 실행하는 방법

nHibernate를 사용하는 테이블에 일괄 적으로 삽입되는 많은 개체 (아마 50000)를 만드는 ASP.NET 웹 응용 프로그램이 있습니다. Nhibernate 최적화를 적용한 경우에도 최대 2 분이 소요됩니다. 격리 수준이 커밋 된 읽기로 설정된 데이터베이스 트랜잭션에서이 작업을 수행합니다.

웹 응용 프로그램의 일괄 처리 삽입 클라이언트는이 테이블에서 이전에 생성 된 데이터를 읽을 수 있어야합니다. 그러나 사용자는 커밋되지 않은 데이터를 읽을 수 없어야합니다. 내 문제는 선택 쿼리에서 격리 수준 "읽기 커밋"을 사용하면 일괄 처리 삽입 작업이 완료 될 때까지 기다리기 때문에 시간이 초과된다는 것입니다.

쿼리가 빠르게 실행되고 일괄 처리 삽입 작업이 완료 될 때까지 기다리지 않고 테이블의 커밋 된 행을 모두 반환하도록 데이터베이스를 쿼리하는 방법이 있습니까? 커밋되지 않은 데이터를 반환하고 싶지 않습니다.

격리 수준을 "스냅 샷"으로 설정했는데 문제가 해결 된 것으로 보이지만 최선의 방법입니까?

안부 기발한

+0

일괄 처리를 몇 개의 작은 배치로 분할하여 분이 아닌 몇 분이 걸릴 수 있고 독립적으로 커밋 할 수 있습니까? – 9000

+0

불행히도,이 경우에는 모두 또는 전혀 없어야합니다. – whimsical82

답변

1

스냅 숏 격리 트랜잭션의 시작 이전에 존재하는 데이터를 반환하고 차단하지 않도록이 테이블에없는 잠금을 수행합니다. 또한 다른 잠금 트랜잭션도 무시하므로 시나리오에 가장 적합한 것으로 들립니다. 무엇을 의미 하는가하면 데이터가 일괄 적으로 삽입되기 때문에 배치가 완료 될 때까지, 그 배치에서 데이터가 SELECT 문에 사용할 수 없습니다 것입니다 (예)

  • 시간 1 : 데이터 집합 A는 표
  • 에 존재
  • 시간 2 : 일괄 처리가 데이터 집합 B를 테이블에 삽입하기 시작하지만 커밋하지 않습니다.
  • 시간 3 : 앱이 스냅 샷을 가져 와서 데이터 세트 A를 읽습니다.
  • 시간 4 : 앱이 데이터 세트 A (및 데이터 세트 A 만)를 종료합니다.
  • 시간 5 : 데이터 세트 B를 작성하는 배치 완료. 데이터 세트 A와 데이터 세트 B는 모두 이며 테이블에서 사용할 수 있습니다.
+0

감사합니다. 나는 SNAPSHOT 격리 수준으로 갈 것이다! – whimsical82

관련 문제