Я работаю над приложением, которое использует EF6 для большинства операций с базой данных, и по большей части материал базы данных некритический и не находится под большой нагрузкой , Существует одно исключение из этого правила, где мы имеем поток возможных событий 100/s, в которые необходимо вставить или обновить строку в определенной таблице на основе значения столбца.Высокие ошибки параллелизма вызывают взаимоблокировки и время запроса> 30 с
Я слабоват с SQL в целом, но я написал этот запрос, чтобы вставить или обновить и вернуть идентификатор элемента:
DECLARE @Id [int];
MERGE {tableName} WITH (UPDLOCK) AS target
USING (SELECT @MatchName AS id) AS source
ON source.id = target.MatchColumn
WHEN MATCHED
THEN UPDATE SET @Id = target.Id, ...
WHEN NOT MATCHED
THEN INSERT (...) VALUES (...);
IF @Id IS NULL
BEGIN
SELECT @Id = CAST(SCOPE_IDENTITY() as [int]);
END;
SELECT @Id;
Это сделано внутри из (EF) сериализуемого блок транзакций, и это единственное, что выполняется в явной транзакции, и является единственным кодом, который обновляет этой таблице. (другие вещи могут читать). Если транзакция откатывается в базе данных (EF генерирует исключение), она повторно повторяется до 3 раз.
Проблема заключается в том, что, когда мы начинаем входить в ситуации с более высокой нагрузкой, мы можем оказаться в этом состоянии, где так много вещей пытается обновить базу данных, а запросы к этой таблице могут начинаться с 30 секунд (запросы к другим таблицам остаются прекрасными). У меня создается впечатление, что, хотя это выполняется в сериализуемой транзакции, он будет блокировать только строки, которые выбираются с помощью слияния, и это должно быть относительно быстрой операцией.
Я провел некоторое исследование в прошлые дни, и некоторые люди считают, что в транзакции по умолчанию достаточно только HOLDLOCK
, а другие утверждают, что необходима сериализуемая транзакция или проблемы с целостностью данных.
Я надеялся, что кто-то может объяснить, почему могут возникать длинные взаимоблокировки, и подробно, какой механизм блокировки является оптимальным в этом сценарии.
Было бы хорошо, если выполнить это заявление с некоторыми значениями и приложить фактический план выполнения на вопрос. – Evk
@Evk: Значения представляют собой всего несколько целых/коротких строковых столбцов, могут немного добавить план выполнения. – caesay