До того как все переходит к HOLDLOCK-s из страха от этих nafarious пользователей, работающих ваши sprocs непосредственно :-) позвольте мне отметить, что вы должны гарантируют уникальность новых ПК с помощью дизайна (ключи идентификации, генераторы последовательностей в Oracle, уникальные индексы для внешних ID-ов, запросы, охватываемые индексами). Это альфа и омега проблемы. Если вы этого не сделаете, ни один из HOLDLOCK-юнионов юниверса не спасет вас, и если у вас это есть, вам не нужно ничего, кроме UPDLOCK, при первом выборе (или первом использовании обновления).
Sprocs обычно работают в очень контролируемых условиях и с допуском доверенного вызывающего абонента (средний уровень). Это означает, что если простой шаблон upsert (update + insert или merge) когда-либо видит дублирующее PK, это означает ошибку в вашем среднем уровне или дизайне таблицы, и хорошо, что SQL будет кричать на ошибку в таком случае и отклонить запись. Размещение HOLDLOCK в этом случае означает использование исключений и получение потенциально ошибочных данных, помимо сокращения вашего перф.
Сказав, что, используя MERGE или UPDATE, тогда INSERT проще на вашем сервере и меньше подвержен ошибкам, так как вам не нужно запоминать добавление (UPDLOCK) для первого выбора. Кроме того, если вы делаете вставки/обновления в небольших партиях, вам нужно знать свои данные, чтобы решить, подходит ли сделка или нет. Это всего лишь коллекция несвязанных записей, тогда дополнительная «обволакивающая» сделка будет пагубной.
Для всех, кто впервые встречает этот вопрос, обязательно прочитайте все ответы и их комментарии. Возраст может иногда приводить к вводящей в заблуждение информации ... – 2014-01-18 20:42:07
* Похожие вопросы: * * [Вставить обновление хранимой процедуры на SQL Server] (http://stackoverflow.com/questions/13540/insert-update-stored-proc-on-sql -сервер) * [SQL Server 2005 реализация MySQL REPLACE INTO?] (http://stackoverflow.com/questions/234/sql-server-2005-implementation-of-mysql-replace-into) – 2008-09-20 15:15:49