Для достижения этой цели я всегда использовал что-то похожее на следующее:
INSERT INTO TheTable
SELECT
@primaryKey,
@value1,
@value2
WHERE
NOT EXISTS
(SELECT
NULL
FROM
TheTable
WHERE
PrimaryKey = @primaryKey)
... но один раз под нагрузкой произошло нарушение первичного ключа. Это единственное утверждение, которое вообще вставляется в эту таблицу. Значит ли это, что вышеупомянутое утверждение не является атомарным?
Проблема в том, что это невозможно воссоздать по своему усмотрению.
Возможно, я могу изменить его на следующее:
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)
Хотя, возможно, я использую неправильные блокировки или слишком много блокировки или что-то в этом роде.
Я видел другие вопросы о stackoverflow.com, где ответы предполагают "IF (SELECT COUNT (*)... INSERT" и т.д., но я всегда находился под (возможно неправильным) предположением о том, что один оператор SQL быть атомарным.
Есть ли у кого-нибудь идеи?