Я вставляю строки в таблицу 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
. Но в моем случае это не так.