小编Spu*_*nik的帖子

从数据库中删除行时,由于更新冲突,快照隔离事务中止

我在这个问题上花了一些时间,终于有了一个重现该问题的示例(即使在所有 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)

sql-server snapshot-isolation sql-server-2019

4
推荐指数
1
解决办法
402
查看次数