Apenas inserindo uma linha se ela ainda não estiver lá
Eu sempre usei algo semelhante ao seguinte para alcançá-lo:
INSERT INTO TheTable
SELECT
@primaryKey,
@value1,
@value2
WHERE
NOT EXISTS
(SELECT
NULL
FROM
TheTable
WHERE
PrimaryKey = @primaryKey)
... mas, uma vez sob carga, ocorreu uma violação da chave primária. Esta é a única instrução que é inserida nesta tabela. Então, isso significa que a afirmação acima não é atômica?
O problema é que é quase impossível recriar à vontade.
Talvez eu possa alterá-lo para algo como o seguinte:
INSERT INTO TheTable
WITH
(HOLDLOCK,
UPDLOCK,
ROWLOCK)
SELECT
@primaryKey,
@value1,
@value2
WHERE
NOT EXISTS
(SELECT
NULL
FROM
TheTable
WITH
(HOLDLOCK,
UPDLOCK,
ROWLOCK)
WHERE
PrimaryKey = @primaryKey)
Embora, talvez eu esteja usando os bloqueios errados ou usando muito bloqueio ou algo assim.
Vi outras perguntas no stackoverflow.com em que as respostas sugerem um "IF (SELECT COUNT (*) ... INSERT" etc.), mas eu sempre tive a suposição (talvez incorreta) de que uma única instrução SQL seria atômica.
Alguém tem alguma idéia?