BulkCopyTimeout에 안정적으로 따르지 않는 SqlBulkCopy.WriteToServer

.net c# sqlbulkcopy sql-server-2008 timeout

문제

SqlBulkCopy에서 순차적 타임 아웃 예외를 계산해야합니다. 이를 테스트하기 위해 외부 응용 프로그램을 사용하여 트랜잭션을 시작하고 대상 테이블을 잠급니다.

첫 번째 호출에서만 SqlBulkCopy가 예상대로 시간 초과 예외를 throw합니다. 우리는 외부 연결 및 트랜잭션을 사용하고 연결 문자열 및 내부 트랜잭션을 사용하여 시도했습니다. 외부 연결 및 트랜잭션에서 무한 대기는 연결을 시작하거나 트랜잭션을 시작하거나 커밋하는 것이 아니며 .WriteToServer() 에서 항상 발생합니다.

SqlBulkCopy.WriteToServer().BulkCopyTimeout 제한에 도달하면 안정적으로 시간 초과 예외가 발생하는 방식이 있습니까?

public void BulkCopy(string connectionString, DataTable table, int bulkTimeout)
{
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(
        connectionString, 
        SqlBulkCopyOptions.UseInternalTransaction))
    {
    bulkCopy.BulkCopyTimeout = bulkTimeout;//e.g. 120 sec.
    //... fill with data, map columns...
    bulkCopy.WriteToServer(table);
    // ^^^^ waits indefinitely, doesn't throw until *after*
    //      the lock is released.
    }
}

필자는 using 블록의 범위에서 예외를 처리하기보다는 예외를 버블 링하는 것을 선호하지만 항상 재복 할 수 있습니다. 모든 통찰력을 가져 주셔서 감사합니다.

업데이트 1 :

아직 해결책 없음. SqlBulkCopy.WriteToServer 메서드를 무기한 정지시키는 동일한 잠금 중에 정상적인 SqlCommand가 예상대로 TimeoutException을 throw합니다.

예상대로 SqlBulkCopy.WriteToServer가 일관되게 타임 아웃을 발생 시키도록 시도한 다음과 같은 시도가 있습니다.

  • MARS (다중 활성 결과 집합) 켜기 / 끄기
  • TableLock on과 off
  • 힙 테이블과 대상 테이블 간의 대상
  • 더 길거나 짧은 BulkTimeout 값 (10 초에서 5 분)
  • 내부 대 외부 거래

지금은 해결 방법으로, 나는 a) WriteToServer 호출을 비동기 래퍼에 두어서 시간을 스스로 바꿀 수 있도록하고, b) WriteToServer를 한 번만 호출하는 것, 시간 초과 후 WriteToServer를 다시 시도하기 전에 일반 SqlCommand 가 성공할 때까지 기다립니다. 이러한 접근 방식을 사용하여 적어도 실행 흐름을 제어 할 수 있습니다.

수락 된 답변

SqlBulkOptions.TableLock 옵션을 SqlBulkCopy에 전달하려고 시도 했습니까? 이 옵션 (따옴표)은 다음을 의미합니다.

대량 복사 작업 기간 동안 대량 업데이트 잠금을 얻습니다.

따라서 테이블을 잠그는 다른 처리가 있으면 잠금이 확보되지 않으며 이론적으로는 시간 초과가 발생하지 않습니다.

최신 정보:
나는 내 자신 만의 테스트 장치를 만들고 재현 할 수 없다. 테이블을 잠 그려면 SELECT * FROM TargetTable WITH (HOLDLOCK) 을 사용하여 SSMS에서 트랜잭션을 시작했습니다. 나는 내부 트랜잭션을 사용하여 벌크로드 시간 초과가 30 초인 동일한 BulkCopy 방법을 질문에 포함했습니다. 30 초 후에 대량 복사 작업을 각 시도가 예상대로 시간 초과됩니다. 그런 다음 SSMS 트랜잭션을 롤백 할 때 성공합니다.

SQL Server 2008 Express, .NET 3.5를 사용하고있었습니다.

첫 번째 시도 후에 벌크로드 타임 아웃이 올바르게 전달되지 않는 것과 같은 것이 아닙니다. 즉 그것은 어떻게 든 "불명확"하게 설정되지 않습니다.

업데이트 2 :
또한 연결 문자열에서 다중 활성 결과 집합을 지원하도록 설정했지만 매번 항상 일관되게 시간 초과됩니다.


인기 답변

나는이 문제가 후자 였고이 문제를 해결하기 위해 BulkCopyTimeout을 0으로 설정했습니다.

bulkCopy.BulkCopyTimeout = 0;


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