Я хочу сделать версию SELECT/INSERT для UPSERT. Ниже приведен шаблон существующего кода:
// CREATE TABLE Table (RowID INT NOT NULL IDENTITY(1,1), RowValue VARCHAR(50))
IF NOT EXISTS (SELECT * FROM Table WHERE RowValue = @VALUE)
BEGIN
INSERT Table VALUES (@Value)
SELECT @id = SCOPEIDENTITY()
END
ELSE
SELECT @id = RowID FROM Table WHERE RowValue = @VALUE)
Запрос будет вызываться из нескольких параллельных сеансов. Мои тесты производительности показывают, что они будут последовательно бросать нарушения первичного ключа при определенной нагрузке.
Существует ли метод высокого уровня concurrency для этого запроса, который позволит ему поддерживать производительность, сохраняя при этом все еще существующие данные?