Почему блокировка Sch-M появляется в тупике при вставке с использованием SqlBulkCopy? - PullRequest
0 голосов
/ 17 марта 2020

Я вставляю строки в таблицу SQL из клиента. NET, используя SqlBulkCopy (через упаковщик ). Вставка происходит одновременно в таблицу с существующими записями и индексами. Код на стороне клиента делает что-то вроде этого:

using (var transaction = dbConnection.BeginTransaction())
{
    // sqlBulkCopyOptions has FireTriggers enabled (the rest are defaults)
    using (var sqlBulkCopy = new SqlBulkCopy(transaction.Connection, sqlBulkCopyOptions, transaction))
    {
        sqlBulkCopy.BulkCopyTimeout = Options.TimeOut;
        sqlBulkCopy.BatchSize = Options.BatchSize;
        sqlBulkCopy.DestinationTableName = string.Format("[{0}].[{1}]", reader.SchemaName, reader.TableName);
        await sqlBulkCopy.WriteToServerAsync(reader);
    }
}

Проблема : У меня есть тупики, которые, вероятно, вызваны SqlBulkCopy. Выдержка из подробностей тупика:

<process id="process282196408c8" taskpriority="0" logused="1192" waitresource="OBJECT: 5:1313391770:7 " waittime="313" ownerId="520852658" transactionname="SetCnstNotTrusted" lasttranstarted="2020-03-16T06:30:18.303" XDES="0x282c4d50428" lockMode="Sch-M" schedulerid="2" kpid="14384" status="suspended" spid="183" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2020-03-16T06:30:18.190" lastbatchcompleted="2020-03-16T06:30:18.117" lastattention="1900-01-01T00:00:00.117" clientapp=".Net SqlClient Data Provider" hostname="rd123" hostpid="1112" loginname="sa" isolationlevel="read committed (2)" xactid="0" currentdb="5" currentdbname="app-db" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
  <executionStack>
    <frame procname="unknown" queryhash="0x13fee7d2f7726b89" queryplanhash="0x149a0fffdf218975" line="1" stmtend="324" sqlhandle="0x02000000587a142a8ef0e5ffcb93a2f465add757d3f1439f0000000000000000000000000000000000000000">unknown</frame>
  </executionStack>
  <inputbuf>insert bulk [dbo].[UserLicenses] ([CustomerId] Int, [UserId] UniqueIdentifier, [License] UniqueIdentifier, [PartitionId] Int) with (FIRE_TRIGGERS)</inputbuf>
</process>

Вопрос : нормально ли, что процесс, выполняющий вставку, получает Блокировка модификации схемы ( Sch-M ) на столе? См. lockMode="Sch-M" в деталях тупика. В Docs говорится, что, кроме изменения схемы, при перестроении индексов можно также получить блокировку Sch-M. Но в моем случае это не так.

...