在使用SQL Server 2008 R2的多用户系统上偶尔会遇到错误,例如"无法在对象' dbo.pages'中插入重复的键行。具有唯一索引' UX_pages_pageid_siteid'。重复键值为(141,4385)。"。该索引确实强制执行唯一性,但这是一个单一的陈述,应该保证唯一性,据我所知:
INSERT INTO pages (pageid, siteid)
SELECT (SELECT ISNULL(CAST(MAX(ABS([pageid])) AS int), 1000) + 1
FROM pages
WHERE siteid = 4385), 4385;
我知道使用自动递增标识会更清晰,但我无法更改架构。
该语句在o_Connection.BeginTrans()
内执行,数据库有is_read_committed_snapshot_on
= 1,我怀疑其参与但我无法重现该问题(例如通过INSERT INTO tblPapers (Url) SELECT MAX(url) + 'z' FROM tblPapers)
修改this blog或者在锁定文档中找到任何解释。
嵌套SELECT
是否真的可以提供过时的数据,即使它在同一个语句中,因此将代码更改为FROM pages (UPDLOCK)
是正确的解决方法吗? / p>
答案 0 :(得分:1)
可能无法扩展但请尝试
INSERT INTO pages with (tablock) (pageid, siteid)
SELECT (SELECT ISNULL(CAST(MAX(ABS([pageid])) AS int), 1000) + 1
FROM pages
WHERE siteid = 4385), 4385;
我刚刚阅读了评论 - 如果(UPDLOCK)工作,那么继续使用