Массовая вставка SQL против обновления - PullRequest
0 голосов
/ 28 июля 2011

У меня есть два процесса, которые иногда запускаются одновременно.

Первый из них - Массовая вставка

using (var connection = new SqlConnection(connectionString))
            {
                var bulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.TableLock)
                                   {DestinationTableName = "CTRL.CTRL_DATA_ERROR_DETAIL",};
                connection.Open();
                try
                {
                    bulkCopy.WriteToServer(errorDetailsDt);
                }
                catch (Exception e)
                {
                    throw new Exception("Error Bulk writing Error Details for Data Stream ID: " + dataStreamId +
                                        " Details of Error : " + e.Message);
                }
                connection.Close();
            }

Второй - Массовое обновление из хранимой процедуры

- Частькод из хранимой процедуры -

UPDATE [CTL].[CTRL].[CTRL_DATA_ERROR_DETAIL]
            SET [MODIFIED_CONTAINER_SEQUENCE_NUMBER] = @containerSequenceNumber
              ,[MODIFIED_DATE] = GETDATE()
              ,[CURRENT_FLAG] = 'N'
            WHERE   [DATA_ERROR_KEY] = @DataErrorKey
                AND [CURRENT_FLAG] ='Y'

Первый процесс запускается в течение некоторого времени (в зависимости от загрузки входящей записи), а второй процесс всегда становится жертвой тупика.

Должен ли я установить SqlBulkCopyOptions.TableLock такэтот второй процесс ожидает освобождения ресурсов.

1 Ответ

1 голос
/ 24 сентября 2011

По умолчанию SqlBulkCopy не принимает эксклюзивные блокировки, поэтому, пока он делает свое дело и вставляет данные, ваш процесс обновления запускается и, таким образом, вызывает тупик.Чтобы обойти это, вы можете поручить SqlBulkCopy использовать эксклюзивную блокировку таблицы, как вы уже предложили, или вы можете установить разумный номер для размера партии массовой вставки.

Если вам это удастся, я думаю,Идея блокировки таблицы - лучший вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...