트랜잭션 내부에서 테이블에 대한 다른 쓰기를 방지 할 때 SqlBulkCopy가 삽입됩니다.

asp.net c# sql sqlbulkcopy sql-server

문제

내 웹 응용 프로그램 사용자는 많은 데이터를 한 번에 삽입하여 성능을 향상시킬 수 있습니다. SqlBulkCopy 클래스를 사용하고 있습니다. 두 개의 서로 다른 테이블에 삽입하는 단일 작업에 대해 여러 번 실행됩니다. 사용자가 작업을 취소하거나 실패하면 격리 수준 스냅 샷을 사용하여 트랜잭션의 모든 내용을 래핑 할 수 있도록 롤백 할 데이터가 필요합니다.

스냅 샷 격리를 사용하면 다른 사용자가 동시에 테이블을 쓰거나 읽을 수 있다는 것을 이해했습니다. 그러나 하나의 데이터 업로드가 발생하는 동안 전체 상위 트랜잭션이 완료 될 때까지 테이블에 대한 다른 모든 쓰기를 차단합니다.

다음은이 문제를 보여주는 간단한 코드입니다. 나는 많은 기능을 제외하고 있지만 아이디어는 동일하게 유지됩니다. 나는 메모리 콜렉션의 일부를 반복하고, 테이블에 일괄 복사하고, 은퇴하고, 다른 테이블로 대량 복사한다.

using (var transaction = myDbContext.Database.BeginTransaction(
System.Data.IsolationLevel.Snapshot))
 {
   var myCollectionOfObjects;

   while(!GetData(ref myCollectionOfObjects))  
   {     

    SqlBulkCopy bulkCopy = new SqlBulkCopy(myCon, transaction);

    //Sets the columns + rows
    SetUp(bulkCopy);

    bulkCopy.WriteToServer();
    //After the bulkcopy operation is complete
    // we retrieve the rows inserted and do another bulk copy to a different table

    var recentlyAddedRows = GetRecentlyAddedRow();

    SqlBulkCopy otherTableBulkCopy = new SqlBulkCopy(myCon, transaction);


    SetUpBulkCopyForOtherTable(otherTableBulkCopy);

    otherTableBulkCopy.WriteToServer();         
     }
    transaction.Commit();
 }

따라서 한 사용자가 현재이 트랜잭션 내에있는 경우 롤백 중이더라도 테이블에 대한 다른 모든 쓰기 트랜잭션이 차단되어 동일한 기능을 수행하거나 테이블에 쓰려고 시도하는 다른 사용자가 차단됩니다.

이것은 예상되는 행동이며이 문제를 해결할 수있는 방법이 있습니까?

편집하다

SQL에 적용된 잠금을 살펴보면 벌크 카피 클래스로 인해 독점 잠금 (X)이 테이블 오브젝트에 설정되어있는 것처럼 보입니다. 한 번에 하나씩 삽입하는 것처럼 의도 된 잠금 만 적용됩니다 테이블 (IX)에. 아직도 주위에 방법이 있는지 확실하지 않지만 이것이 잠금 에스컬레이션 때문이라고 가정합니다.

테이블 인덱스에서 허용 페이지 잠금을 변경하고 대량 복사의 일괄 처리 크기를 변경하는 것은 일부 테스트에서 완전히 잠겼지만 다소 변덕 스럽습니다.

인기 답변

IsolationLevel 은 읽기 전용이고 쓰기는 지칭하지 않습니다. 클라이언트 중 하나가 데이터를 쓰고있는 경우 다른 클라이언트는 트랜잭션 시작 전이었던 것처럼 데이터를 읽을 수 있어야하지만 동시에 작성할 수는 없습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.