SqlBulkCopy가 자동으로 트랜잭션을 시작합니까?

bulkinsert c# sqlbulkcopy sql-server transactions

문제

SqlBulkCopy 를 통해 데이터를 삽입하는 방법은 다음과 같습니다.

public void testBulkInsert(string connection, string table, DataTable dt)
{
    using (SqlConnection con = new SqlConnection(connection))
    {
        con.Open();

        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con))
        {
            bulkCopy.DestinationTableName = table;
            bulkCopy.WriteToServer(dt);
        }
    }
}

이 작업은 자동으로 SQL 트랜잭션으로 래핑되어 DB를 반쯤 잘못 입력하면 대량 삽입이 시작되기 전과 동일한 상태로 남아있게됩니까? 또는 절반의 데이터가 삽입됩니까?

즉, con.BeginTransaction 을 명시 적으로 호출 con.BeginTransaction

또는 문자열을 사용하는 SqlBulkCopy 의 생성자를 호출하면 트랜잭션에서 발생하는 더 좋은 방법일까요?

public void testBulkInsert(string connection, string table, DataTable dt)
{
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
    {
        bulkCopy.DestinationTableName = table;
        bulkCopy.WriteToServer(dt);
    }
}

처음에는이 문제에 대해 문서 가 약간 불분명하다고 생각합니다.

기본적으로 대량 복사 작업은 격리 된 작업으로 수행됩니다. 대량 복사 작업은 비 트랜잭션 방식으로 수행되며 롤백 할 기회는 없습니다.

그러나 나중에 국가

기본적으로 대량 복사 작업은 자체 트랜잭션입니다. 전용 대량 복사 작업을 수행하려면 연결 문자열을 사용하여 SqlBulkCopy의 새 인스턴스를 만들거나 활성 트랜잭션없이 기존 SqlConnection 개체를 사용하십시오. 각 시나리오에서 대량 복사 작업은 트랜잭션을 생성 한 다음 커밋하거나 롤백합니다.

그래서해야 할 일은 다음과 같습니다.

public void testBulkInsert(string connection, string table, DataTable dt)
{
    using (SqlConnection con = new SqlConnection(connection))
    {
        con.Open();
        using (SqlTransaction tr = con.BeginTransaction(IsolationLevel.Serializable))
        {
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con, SqlBulkCopyOptions.Default, tr))
            {
                bulkCopy.DestinationTableName = table;
                bulkCopy.WriteToServer(dt);
            }
            tr.Commit();
        }
    }
}

수락 된 답변

아니 여기에서 텍스트 없다 SqlBulkCopy 의 문서를 MSDN은

기본적으로 대량 복사 작업은 격리 된 작업으로 수행됩니다. 대량 복사 작업은 처리되지 않은 방식으로 수행되며 롤백 할 기회는 없습니다. 오류가 발생했을 때 대량 복사의 전체 또는 일부를 롤백해야하는 경우 SqlBulkCopy 관리 트랜잭션 을 사용하거나 기존 트랜잭션 내에서 대량 복사 작업을 수행하거나 System.Transactions 트랜잭션에 참여시킬 수 있습니다.

편집 : 내가 당신에게 준 링크에서 설명서를 올바르게 읽으십시오.

기본적으로 대량 복사 작업은 자체 트랜잭션입니다. 전용 대량 복사 작업을 수행하려면 연결 문자열을 사용하여 SqlBulkCopy의 새 인스턴스를 만들거나
활성 트랜잭션이없는 기존 SqlConnection 개체 각 시나리오에서 대량 복사 작업은 트랜잭션을 생성 한 다음 커밋하거나 롤백합니다.

이것은 기본 내부 가 아닌 대소 문자 내부 대량 복사 트랜잭션을 위해 작성되었습니다!

   using (SqlBulkCopy bulkCopy = new SqlBulkCopy(
                       connectionString, SqlBulkCopyOptions.KeepIdentity |
                       SqlBulkCopyOptions.UseInternalTransaction))
   {
       ....
   }

SqlBulkCopyOptions.UseInternalTransaction 자세히 살펴보십시오! SqlBulkCopy 클래스 생성자에서 UseInternalTransaction 옵션을 명시 적으로 지정하여 대량 복사 작업을 자체 트랜잭션에서 명시 적으로 실행하면 대량 복사 작업의 각 일괄 처리가 별도 트랜잭션 내에서 실행됩니다. 다른 트랜잭션에서 다른 일괄 처리가 실행되므로, 대량 복사 작업 중에 오류가 발생하면 현재 일괄 처리의 모든 행이 롤백되지만 이전 일괄 처리의 행은 데이터베이스에 남아 있습니다.


오류가 발생하여 전체 대량 복사 작업을 롤백해야하거나 대량 복사를 롤백 할 수있는 더 큰 프로세스의 일부로 실행해야하는 경우 SqlBulkCopy 생성자에 SqlTransaction 개체를 제공 할 수 있습니다.

외부 트랜잭션의 경우.

            using (SqlTransaction transaction =
                       destinationConnection.BeginTransaction())
            {
                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(
                           destinationConnection, SqlBulkCopyOptions.KeepIdentity,
                           transaction))
                {
                     ....
                }
            }

구걸에서 응답이 아니오라고 말한 것처럼 기존 트랜잭션 또는 내부 대량 복사 트랜잭션을 사용해야합니다. 자세한 정보는 링크에있는 문서 파일을 읽으십시오.

거래를 원한다면 내가 쓴 두 가지 경우 중 하나를 사용해야합니다.



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