J'ai toujours utilisé de quelque chose de similaire à la suivante, pour l'atteindre:
INSERT INTO TheTable
SELECT
@primaryKey,
@value1,
@value2
WHERE
NOT EXISTS
(SELECT
NULL
FROM
TheTable
WHERE
PrimaryKey = @primaryKey)
...mais une fois sous la charge, une violation de clé primaire est produite. C'est la seule instruction qui s'insère dans ce tableau. Donc, est-ce à dire que la déclaration ci-dessus n'est pas atomique?
Le problème, c'est que c'est presque impossible à recréer à volonté.
Je pourrais peut-être changer la chose comme suit:
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)
Bien que, peut-être que je suis en utilisant le mauvais serrures, ou d'utiliser trop de verrouillage ou de quelque chose.
J'ai vu d'autres questions sur stackoverflow.com où les réponses sont ce qui suggère un "IF (SELECT COUNT(*) ... INSÉRER", etc., mais j'ai toujours été en vertu de la (peut-être erronée) hypothèse qu'une seule instruction SQL serait atomique.
Quelqu'un aurait-il des idées?
Merci.
Adam