我在这个问题上花了一些时间,终于有了一个重现该问题的示例(即使在所有 FK 上都有适当的非聚集索引)。
这是数据库操作的简要概述:
a) 更新/插入是在已提交读(快照)隔离下完成的。
b) 项目的删除是在快照隔离下完成的。
c) 所有FK都有索引。
清除过程会从数据库中删除旧的行。20-60 分钟后,下面的删除脚本将失败并出现快照错误。我被告知 FK 检查会恢复为读提交隔离,但即使这样也无法解释我们下面看到的内容。
重现步骤:
a) 创建数据库并确保快照选项为True。我们将该数据库称为 SnapshotTest。
b) 使用以下脚本创建数据库:
ALTER DATABASE [SnapshotTest] SET READ_COMMITTED_SNAPSHOT ON
GO
CREATE TYPE [dbo].[udtPPChildObject] AS TABLE(
[InsertionId] [bigint] NOT NULL,
[ChildInsertionId] [bigint] NOT NULL,
[PropertyMapNameId] [int] NOT NULL,
[UpdateId] [bigint] NULL,
PRIMARY KEY CLUSTERED
(
[ChildInsertionId] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO
CREATE TYPE [dbo].[udtPPChildObjectList] AS TABLE(
[InsertionId] [bigint] NOT NULL,
[ChildInsertionId] [bigint] NOT NULL,
[SortIndex] [int] NULL,
[UpdateId] [bigint] NULL,
[SortText] [nvarchar](260) …Run Code Online (Sandbox Code Playgroud)