Preciso saber se o padrão a seguir requer que eu o use HOLDLOCK
em um ambiente altamente concorrente. Observe particularmente que source
não é outra tabela. São basicamente parâmetros que foram passados para a consulta.
MERGE INTO table1 WITH (HOLDLOCK) AS target
USING (
SELECT
@ID AS ID,
...
) AS source
ON (target.ID = source.ID AND ...)
WHEN NOT MATCHED THEN
INSERT (ID, ...)
VALUES (source.ID, ...)
Eu só o coloquei por precaução, já que tenho lido sobre as armadilhas do MERGE
. No meu próprio teste de desenvolvimento (ainda muito altamente concorrente), não parece fazer diferença. Nunca tive problemas de simultaneidade, mesmo sem o HOLDLOCK
.
Não posso usar INSERT INTO table1 ... WHERE ... DOES NOT EXISTS (... SELECT table1 ...)
o padrão, porque isso gera problemas de concorrência, mesmo com o HOLDLOCK
in place. Então, essa MERGE
foi minha solução para isso, só não tenho certeza se preciso disso HOLDLOCK
.