gpt4 book ai didi

c# - 如何锁定和解锁 SQL SERVER 表?

转载 作者:太空狗 更新时间:2023-10-29 23:28:18 26 4
gpt4 key购买 nike

冒着过度解释我的问题的风险,我会在信息过多方面犯错。

我正在创建一个批量上传过程,将数据插入到两个表中。两个表大致如下。 TableA是一个自引用表,允许 N 级引用。

Parts (self-referencing table)
--------
PartId (PK Int Non-Auto-Incrementing)
DescriptionId (Fk)
ParentPartId
HierarchyNode (HierarchyId)
SourcePartId (VARCHAR(500) a unique Part Id from the source)
(other columns)

Description
--------
DescriptionId (PK Int Non-Auto-Incrementing)
Language (PK either 'EN' or 'JA')
DescriptionText (varchar(max))

(我还应该注意,还有其他表格将引用我们的 PartID,我现在不考虑了。)

Description , Description的组合和 Language将是唯一的,但实际的`DescriptionID 将始终至少有两个实例。

现在,对于批量上传过程,我创建了两个看起来很像 Parts 的临时表。和 Description但没有任何 PK、索引等。它们是 Parts_StagingDescription_Staging .

Parts_Staging有一个额外的列包含一个层次节点字符串,它是这种格式的层次节点: /1/2/3/等然后当数据从_Staging表复制到实际表时,我使用 CAST(Source.Column AS hierarchyid) .

由于在两个表中共享的 ID 的复杂性, Parts 中的自引用 ID 和层次 ID。 ,以及要插入的行数(可能在 100,000 中)我决定首先 100% 编译 C# 模型中的所有数据,包括 PK ID。所以这个过程在 C# 中是这样的:
  • 查询两个表的 MAX ID
  • 使用这些最大 ID,编译两个表的所有数据的完整模型(包括层级 ID/1/2/3/)
  • 对两个 _Staging 表进行批量插入
  • 触发一个 SP,将两个 _Staging 表中的非重复数据复制到实际表中。 (这是 CAST(Source.Column AS hierarchyid) 发生的地方)。

  • 我们正在导入大量零件书,单个零件可能会在多本书中复制。我们需要删除重复项。在步骤 4 中,通过检查 SourcePartId 清除重复项。在 Parts表和 DescriptionDescriptionTextDescription table 。

    整个过程运行得很漂亮!最重要的是,它真的很快。但是,如果您仔细阅读本文(如果您阅读了,我很感谢),那么您已经注意到一个明显的问题。

    如果多个进程同时发生(而且这绝对会发生!)那么存在混淆 ID 和数据真正损坏的非常真实的风险。 Process1 可以做 GET MAX ID查询并在它设法完成之前,Process2 还可以执行 GET MAX ID查询,因为 Process1 还没有真正写入表,它会得到相同的 ID。

    我最初的想法是使用 SEQUENCE 对象。起初,这个计划似乎很出色。但它在测试中失败了,因为当从 _Staging 表复制到最终表时,完全有可能对相同的数据进行多次处理并最终被忽略。在这种情况下,序列号已经被声明和使用,导致 ID 中出现巨大的空白。并不是说这是一个致命的缺陷,而是我们宁愿避免的问题。

    所以......这是问这个实际问题的很多背景信息。我想做的是这样的:
  • 锁定有问题的两个表
  • 上面概述的步骤 1-4
  • 解锁两张 table 。

  • 该锁需要是一个 READ 锁(我认为它是一个排他锁?),以便如果另一个进程尝试执行 GET MAX ID查询,它将不得不等待。

    我的问题是:1)这是最好的方法吗?以及 2) 如何在表上放置排他锁?

    谢谢!

    最佳答案

    我不确定最好的方法是什么,但就在表上放置“独占”锁而言,只需在查询中使用 with (TABLOCKX) 就会将一个放在表上。

    如果你想了解它;

    https://msdn.microsoft.com/en-GB/library/ms187373.aspx

    关于c# - 如何锁定和解锁 SQL SERVER 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55047552/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com