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?

questionAnswers(6)

yourAnswerToTheQuestion