【发布时间】:2011-03-21 08:27:42
【问题描述】:
我正在使用 SQL Server 2008,并且希望能够利用类似 mySQL 的 ON DUPLICATE KEY UPDATE 子句的 INSERT 语句
当前的遗留代码执行删除和后续插入,这会遇到来自不同线程的重复键插入的并发问题:
这是我在生产环境中看到的错误:
Violation of PRIMARY KEY constraint 'PK_Audience'. Cannot insert duplicate key in object 'dbo.Audience'.
(sp_ContentUpdate)
主键:
AudienceId, VersionId
有问题的 SQL:
DELETE FROM dbo.Audience
WHERE VersionId = @VersionId
IF @AudienceXml IS NOT NULL
BEGIN
INSERT INTO dbo.Audience (
VersionId,
AudienceId,
CreatedDate,
CreatedByPersonId,
)
SELECT @VersionId,
AudienceId,
GETUTCDATE(),
@PersonId
FROM dbo.Audience
JOIN @AudienceXml.nodes('/Audiences/Audience') node(c)
ON Audience.AudienceName = c.value('@Name', 'nvarchar(50)')
END
在事务中包装此 TSQL 似乎可以消除并发问题或通过更改时间来掩盖问题。但是,我认为包装事务实际上并没有解决并发问题。
也许我正在处理这个错误。感谢您的建议。
【问题讨论】:
标签: sql sql-server sql-server-2008 concurrency merge