如何锁定和解锁 SQL SERVER 表?

2024-03-01

冒着过度解释我的问题的风险,我会错误地提供太多信息。

我正在创建一个批量上传过程,将数据插入两个表中。这两个表大致如下所示。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我暂时不谈这个。)

In Description, 的组合Description and Language将是唯一的,但实际的“DescriptionID”将始终具有至少两个实例。

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

In Parts_Staging还有一个额外的列,其中包含一个 Hierarchy Node String,它是这种格式的 HierarchyNode:/1/2/3/等等。然后,当数据从 _Staging 表复制到实际表时,我使用CAST(Source.Column AS hierarchyid).

由于两个表之间共享的 ID 很复杂,因此自引用 id 和 hierarchyidParts,以及要插入的行数(可能是 100,000 行)我决定首先 100% 编译 C# 模型中的所有数据,包括 PK ID。所以这个过程在 C# 中看起来像这样:

  1. 查询两个表的 MAX ID
  2. 使用这些最大ID,编译两个表的所有数据的完整模型(包括hierarchyid /1/2/3/)
  3. 对两个 _Staging 表进行批量插入
  4. 触发一个 SP,将两个 _Staging 表中的非重复数据复制到实际表中。 (这就是CAST(Source.Column AS hierarchyid)发生)。

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

整个过程非常顺利!最重要的是,它非常快。但是,如果您仔细阅读本文(如果您仔细阅读,我会表示感谢),那么您已经注意到一个明显的问题。

如果多个进程同时发生(这绝对会发生!),那么就存在 ID 混淆和数据真正损坏的风险。 Process1 可以执行以下操作GET MAX ID查询并在完成之前,Process2 还可以执行GET MAX ID查询,并且由于 Process1 尚未实际写入表,因此它将获得相同的 ID。

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

所以...有很多背景信息来提出这个实际问题。我想做的是这样的:

  1. 锁定两个有问题的表
  2. 如上所述的步骤 1-4
  3. 解锁两个表。

该锁需要是读锁(我认为是排它锁?),这样如果另一个进程尝试执行GET MAX ID查询,则需要等待。

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

Thanks!


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

如果你想了解它;

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何锁定和解锁 SQL SERVER 表? 的相关文章

  • WPF MVVM将DataTable绑定到DataGrid不显示数据

    我有一个简单的控件 其中包含一个 DataGrid 其中 ItemsSource 绑定到 DataTable 当我填充 DataTable 时 我可以看到 DataGrid 中添加了行 但没有显示任何数据 我没有为此 DataGrid 使用
  • Reflection.Emit 中的短格式操作码错误

    我正在制作一种与以下非常相似的小语言hlsl但仅支持像素着色器 该语言使用reflection emit构建实现相同功能的 NET 程序集 我目前正在测试分支指令的实现if在我的一个单元测试中 一个大的if与内if elses 失败并显示以
  • 将 try_emplace 与 shared_ptr 一起使用

    所以我有一个std unordered map
  • 无法更新 .mdf 数据库,因为该数据库是只读的(Windows 应用程序)

    我使用 C 创建了一个数据库 Windows 应用程序 我的应用程序在 Windows XP 上成功运行 但在 Vista 或 Windows 7 系统上无法正确执行 我的应用程序显示类似以下内容的消息 无法更新 mdf 数据库 因为该数据
  • Code First - 实体框架 - 如何公开外键

    我有以下数据对象 public class Customer System Data Entity ModelConfiguration EntityTypeConfiguration
  • c#Registry to XML无效字符问题

    我在尝试从注册表创建 XML 文件时遇到问题 在我的笔记本电脑 W7 64b 上它工作正常 生成了 xml 文件 但在另一台计算机 Xp 32b 上抛出异常 System ArgumentException 十六进制值 0x00 是无效字符
  • 从空白启动时 VSTO 功能区不显示解决方案

    如果我从 文件 新建项目 菜单创建一个新的 Excel 2013 和 2016 VSTO 加载项 项目 然后单击 项目 添加新项目 gt 功能区 可视化设计器 则一切正常 我启动了应用程序 我的功能区显示在 Excel 中 但是 如果我首先
  • NHibernate 中具有不同类型答案的问题

    我正在尝试找到一个问卷问题的简洁解决方案 假设我有一个Questionnaire类有一个集合Answers e g public class Questionnaire public virtual ISet
  • Parallel.For 和 Break() 误解?

    我正在研究 For 循环中的并行性中断 看完之后this http tipsandtricks runicsoft com CSharp ParallelClass html and this http reedcopsey com 201
  • 允许 .NET WebApi 忽略 DOCTYPE 声明

    我正在尝试通过 WebApi 方法将 XML 反序列化为对象 我有以下课程 XmlRoot IsNullable false public class MyObject XmlElement Name public string Name
  • 使用32位应用程序获取syswow64目录

    我正在尝试在系统目录中查找文件 问题是当使用 Environment SystemDirectory 在 x64 计算机上 我仍然获得 System32 目录 而不是 Systemwow64 目录 我需要在 x86 机器上获取 System
  • 在 C# 中加密并在 Flex 中解密

    我需要解密 Flex 中的一些数据 这些数据是用 C 加密并写入文件的 为了简单起见 我选择使用 as3crypto As3 库和 Bruce Schneier C 库 AS3 as3加密链接 http code google com p
  • 将参数从 Web 表单传递到 Crystal 报表

    我有一份报告 我想将其显示在网络表单上 没有参数的报告运行良好 带参数的报告让我很头疼 这是我在 BindReport 方法中编写的代码 该代码在表单的页面加载事件上调用 ReportDocument rpt new ReportDocum
  • gcc 中的“假设”子句

    gcc 最新版本 4 8 4 9 是否有类似于以下的 假设 子句 assume 内置icc支持吗 例如 assume n 8 0 从 gcc 4 8 2 开始 gcc 中没有 assume 的等效项 我不知道为什么 这会非常有用 马夫索建议
  • 修改公共属性的访问修饰符是否是重大更改?

    如果我将公共属性的 setter 的访问修饰符从私有更改为公共 是否会导致引用它的其他程序集发生任何重大更改 UPDATE 这个问题是我 2012 年 1 月博客的主题 https ericlippert com 2012 01 09 ev
  • 更新插入 MongoDB 时如何防止出现“_t”字段?

    我有一个应用程序 它使用 MongoDB 的 C 驱动程序将 Upsert 插入 MongoDB 数据库 当我打电话给Update函数 我无法指定我要更新的类型 然后 t字段插入元素的类型 这是我用来更新插入的代码 collection U
  • 什么是多重重继承?

    我将以下称为 多重重新继承 直接继承一个类一次 并通过继承其一个或多个后代来间接继承一次或多次 通过继承一个类的两个或多个后代来间接继承一个类两次或多次 我想知道它是否存在以及如何明确访问嵌入的子对象 1 Professional C 2n
  • 父窗体中的居中消息框[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以在 net 2 0中将MessageBox居中于父窗体中 我在 C 中确实需要这个并发现中心消息框 C http bytes com topic c sharp answers 26712
  • 扁平化/反规范化 SQL 查找表的最佳方法?

    我有很多这样的表 Lookup HealthCheckupRisks ID Name 1 Anemia 2 Anorexic 3 Bulemic 4 Depression 122 Syphilis PatientRisksOnCheckup
  • C++20 范围太多 |运营商?

    我在这段代码中使用 g 10 2 有谁知道为什么我最后收到编译器错误std views reverse on results3 include

随机推荐