Solo insertando una fila si aún no está allí
Siempre había usado algo similar a lo siguiente para lograrlo:
INSERT INTO TheTable
SELECT
@primaryKey,
@value1,
@value2
WHERE
NOT EXISTS
(SELECT
NULL
FROM
TheTable
WHERE
PrimaryKey = @primaryKey)
... pero una vez bajo carga, se produjo una violación de clave principal. Esta es la única declaración que se inserta en esta tabla. Entonces, ¿esto significa que la afirmación anterior no es atómica?
El problema es que esto es casi imposible de recrear a voluntad.
Quizás podría cambiarlo a algo como lo siguiente:
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)
Aunque, tal vez estoy usando los bloqueos incorrectos o demasiado bloqueo o algo así.
He visto otras preguntas en stackoverflow.com donde las respuestas sugieren un "IF (SELECT COUNT (*) ... INSERT" etc., pero siempre estuve bajo el supuesto (quizás incorrecto) de que una sola declaración SQL sería atómica.
¿Alguien tiene alguna idea?