Я всегда использовал для этого что-то похожее на следующее:
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, где ответы предлагают "ЕСЛИ (ВЫБРАТЬ)COUNT (*) ... INSERT "и т. Д., Но я всегда придерживался (возможно, неверного) предположения, что один SQL-оператор будет атомарным.
У кого-нибудь есть идеи?