在“选择前 n”查询中返回未锁定的行

2023-11-22

我需要有一个 MsSql 数据库表和另外 8 个(相同的)进程并行访问同一个表 - 选择前 n 行,处理这 n 行,并更新这些行的列。问题是我只需要选择并处理每一行一次。这意味着,如果一个进程访问数据库并选择了前 n 行,那么当第二个进程到来时,它应该会发现这些行已锁定,并选择 n 到 2*n 行中的行,依此类推...

当您选择某些行时,以及当有人请求锁定的前 n 行以返回下一行时,是否可以对某些行进行锁定,而不是等待锁定的行?看起来似乎是一个很遥远的事情,但是……

我在想的另一件事 - 也许不是那么优雅,但听起来简单且安全,是在数据库中为在该表上进行选择的实例设置一个计数器。第一个实例将增加计数器并选择前 n 个,下一个实例将增加计数器并选择从 n*(i-1) 到 n*i 的行,依此类推...

这听起来是个好主意吗?您有更好的建议吗?任何想法都受到高度赞赏!

谢谢你的时间。


这是一个示例我不久前写过博客:

READPAST 提示可确保多个进程在轮询要处理的记录时不会互相阻塞。另外,在这个例子中,我有一个位字段来物理“锁定”记录 - 如果需要的话可以是日期时间。

DECLARE @NextId INTEGER
BEGIN TRANSACTION

-- Find next available item available
SELECT TOP 1 @NextId = ID
FROM QueueTable WITH (UPDLOCK, READPAST)
WHERE IsBeingProcessed = 0
ORDER BY ID ASC

-- If found, flag it to prevent being picked up again
IF (@NextId IS NOT NULL)
    BEGIN
        UPDATE QueueTable
        SET IsBeingProcessed = 1
        WHERE ID = @NextId
    END

COMMIT TRANSACTION

-- Now return the queue item, if we have one
IF (@NextId IS NOT NULL)
    SELECT * FROM QueueTable WHERE ID = @NextId
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在“选择前 n”查询中返回未锁定的行 的相关文章

  • 关于多客户端和可定制 Web 应用程序的架构所需的建议[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何查询集成服务目录

    问题 识别连接到 SQL Server 上特定数据库表的所有 SSIS 包 详细信息 服务器上部署了近 100 个包 大多数包的大小都很大 因此很难以高精度手动检查它们 有没有一种快速且自动化的方法来做到这一点 使用 SQL Server
  • 从 SQL Server 读取十进制值时出现溢出异常

    我想知道这是一个错误还是我做错了什么 我正在加载值SqlDataReader来自 SQL Server 2008 数据库 但在某些情况下 它无法将 SQL 值转换为 net 值 NET 4 0 我已将其追溯到一个测试用例 它演示了实际问题
  • 如何从 SQL Server 中的 SELECT 进行更新?

    In SQL服务器 可以将行插入到带有INSERT SELECT陈述 INSERT INTO Table col1 col2 col3 SELECT col1 col2 col3 FROM other table WHERE sql coo
  • 如何在 SQL Server 中创建文件格式

    我正在尝试在 SQL Server 2017 中试验外部文件 但在第一步中遇到了困难 数据是管道分隔的 我试图遵循文档中的语法 这需要一个FILE FORMAT 以下是 Microsoft 的语法 CREATE EXTERNAL TABLE
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 在 SQL Server 中通过标准差消除异常值

    我试图通过标准差消除 SQL Server 2008 中的异常值 我只想要特定列中包含该列平均值的 1 标准差范围内的值的记录 我怎样才能做到这一点 如果您假设事件呈钟形曲线分布 则只有 68 的值与平均值相差 1 个标准差以内 95 的值
  • 在 Sql STUFF 命令中将最后一项的逗号分隔符替换为“and”

    如果我查询的输出是英国 美国 印度 是否可以像英国 美国那样显示查询结果and India 这是我的查询 Select stuff Select Distinct Country as text from tbl Country where
  • SQL Server Management Studio v18 的命令行参数登录

    使用 SQL Server 身份验证时是否仍然可以从命令行打开 SQL Server Management Studio v18 根据微软的发行说明 由于安全风险 他们删除了 P 命令行参数 因此 可以从命令行使用 SQL Server 身
  • SQL Server 中的嵌套事务

    sql server 允许嵌套事务吗 如果是的话那么交易的优先级是什么 来自 SQL Server 上的 MSDN 文档 嵌套交易 http msdn microsoft com en us library ms189336 SQL 90
  • 在 SQL Server 中将 UTC 毫秒转换为 DATETIME

    我想在 SQL Server 中将 UTC 毫秒转换为 DateTime 这可以通过以下代码在 C 中轻松完成 DateTime startDate new DateTime 1970 1 1 AddMilliseconds 1348203
  • SQL Server 大小写/排序规则问题

    今天我在客户数据库中遇到了一个奇怪的情况 SQL Server 2005 数据库排序规则不区分大小写 因此我可以使用任何大小写编写 SQL 查询 没有任何问题 除了一个 一张特定表中的一个特定列称为 DeadZone 如果我这样查询 从表名
  • SQL 查询将文本数据存储在 Varbinary(max) 中

    有没有办法让 varbinary 在 SQL Server 中接受文本数据 这是我的情况 我有相当大量的 XML 我计划以 压缩 格式存储它们 这意味着 Varbinary 但是 当我进行调试时 我希望能够翻转配置开关并以纯文本形式存储 以
  • 当我使用可变参数而不是常量参数时,为什么我的内联表 UDF 慢得多?

    我有一个表值内联 UDF 我想过滤该 UDF 的结果以获得一个特定值 当我使用常量参数指定过滤器时 一切都很好 并且性能几乎是瞬时的 当我使用可变参数指定过滤器时 它会花费明显更大的时间块 大约是逻辑读取的 500 倍和持续时间的 20 倍
  • 让 Hibernate 和 SQL Server 与 VARCHAR 和 NVARCHAR 良好配合

    我目前正在大型数据库的某些表中启用 UTF 8 字符 这些表已经是 MS SQL 类型 NVARCHAR 此外 我还有几个使用 VARCHAR 的字段 Hibernate 与 JDBC 驱动程序的交互存在一个众所周知的问题 例如 参见在 h
  • Docker 中的 Web api 无法连接到主机上的 SQL Server,并出现登录前握手错误

    首先有一些类似的问题 但我已经尝试了我能找到的所有建议 但似乎没有任何效果 如果你能找到我没有提到的 请评论 我会尝试一下 概要是我正在尝试将 Docker 容器中的 NET Core 3 1 Web api 连接到主机上的 SQL Ser
  • SQL Server 2012:有条件地增加计数器用户 ROW_NUMBER()

    我正在尝试申请ROW NUMBER 根据特定条件增加计数器 我的数据如下所示 目标计数器是Prep column id DSR PrepIndicator Prep 1662835 1 1 1 1662835 14 2 2 1662835
  • SQL Server - 将行连接到逗号分隔的列表中

    假设我有一个临时表 如下所示 Id Value 1 1 1 2 1 3 2 1 2 2 我希望我的桌子是这样的 Id ValueList 1 1 2 3 2 1 2 所以基本上我需要将我的值分组为逗号分隔的列表 我已经尝试过以下操作 SEL
  • 更好地理解 SQL Server 中的架构

    就像标题一样 我还是一个SQLServer菜鸟 当我创建表 Mytable 时 数据库中显示 dbo Mytable 但有人能让我更好地理解模式吗 另外 在 Server 2008 TSQL 一书中 Itzik 说 在你的数据库中 表属于模
  • codeigniter,获取mysql表列中的最大值

    我正在使用 codeigniter 2 我有一个 mysql 表列 存储每个学生所用的时间 例如 1 2327 0 6547 1 9876 我想获得最大值 值该列 这是我的代码 this gt db gt select max time t

随机推荐

  • Grails hasOne 与belongsTo

    要在 Grails 中创建一对一关系 我可以这样做 class Person static hasOne address Address 在这种情况下 地址表拥有其个人的密钥 我还可以这样做 class Address static bel
  • 将焦点设置在android中listview的任何项目上

    我有一个列表视图 其中包含文本视图作为其元素 现在我希望在启动应用程序时自动聚焦列表的第一项 当我单击其他视图 例如按钮 时 如何将焦点设置在列表中的任何项目上 设置选择和设置焦点是两个不同的事情 如果您只想将选择设置为某个项目 那么您可以
  • 由于 CORS 限制,无法使用 firebase 进行本地测试

    我当前的用例很简单 我只需要向我本地开发的云函数发出post请求 问题是 当我开火时 firebase serve 托管部署在本地主机 5000 并且云功能部署在本地主机 5001 由于端口不同 这两者来自不同的来源 因此 当浏览器发送初始
  • 如何处理对数图中的零

    问题 我想使用 ggplot2 将数据绘制在 y 轴上具有对数刻度的折线图中 不幸的是 我的一些价值观一路下降到零 数据表示依赖于某些参数的特征的相对出现 当在样本中没有观察到该特征时 值为零 这意味着它很少出现 或者实际上从未出现 这些零
  • Android游戏RPG库存系统

    我使用 ArrayList 作为我的 库存 我无法找到一种方法来添加多个相同的物品而不占用 库存 中的位置 例如 我在库存中添加了一瓶药水 现在我添加了另一种药水 但这次不是在库存中添加另一种药水 而是应该显示我有 药水 x 2 同时只占用
  • 获取 Urllib2.Request 的请求标头?

    有没有办法从使用 Urllib2 创建的请求中获取标头或确认使用 urllib2 urlopen 发送的 HTTP 标头 查看请求 和响应标头 的一种简单方法是启用调试输出 opener urllib2 build opener urlli
  • llvm JIT 将库添加到模块

    我正在开发一个使用 LLVM 的 JIT 该语言有一个用 C 编写的小型运行时 我使用 clang 将其编译为 LLVM IR clang runtime cu cuda gpu arch sm 50 c emit llvm 然后加载 bc
  • Hadoop 流 - 从减速器输出中删除尾随选项卡

    我有一个 hadoop 流作业 其输出不包含键 值对 您可以将其视为仅值对或仅键对 我的流式减速器 一个 php 脚本 正在输出由换行符分隔的记录 Hadoop 流处理将此视为没有值的键 并在换行符之前插入一个制表符 这个额外的选项卡是不需
  • 获得 Cassandra Writes 背压的最佳方法是什么?

    我有一项服务以我控制的速率消耗队列中的消息 我做了一些处理 然后尝试通过 Datastax Java 客户端写入 Cassandra 集群 我已经设置了我的 Cassandra 集群maxRequestsPerConnection and
  • 使用友元函数进行前向声明:不完整类型的使用无效

    include
  • 如果我不需要用户访问令牌,如何使用请求从 Python 连接到 Facebook Graph API?

    我正在尝试找到如何使用我最喜欢的 Facebook Graph API 的最简单方法Requests图书馆 问题是 我发现的所有例子都是关于获取用户访问令牌 关于重定向和用户交互 我所需要的只是应用程序访问令牌 我不处理任何非公开数据 因此
  • std::list 应该被弃用吗?

    根据 Bjarne Stroustrup 的说法slides从他的2012 年本土化主题演讲 在a中插入和删除std list在现代硬件上效率非常低 矢量节拍列表大量用于插入和删除 如果这确实是真的 那么还剩下哪些用例std list 那不
  • DataTrigger 不会更改 Text 属性

    我正在尝试在样式上使用数据触发器来更改属性 符合 最小 完整且可验证的示例 要求 要重现 首先在 Visual Studio 中创建一个 WPF 应用程序 在 App xaml cs 内 using System ComponentMode
  • 405(方法不允许)并被 CORS 策略阻止

    我有 Asp Net Core 3 WebApi 项目 其 UI 基于客户端的 Angular 7 2 1 当使用 Postman 或仅使用 URL 时 我可以使用 GET 和 POST 而不会出现任何特定错误 当通过 Angular Ch
  • 在合并列中将两个数据帧与 pd.NA 合并会产生“TypeError:NA 的布尔值不明确”

    使用 Pandas 1 0 1 如果以下情况我无法合并 df df merge df2 on some column yields File home torstein code fintechdb Sheets sheets gild p
  • 为什么不在单元测试中访问数据库?

    我在博客中读到 单元测试运行时不应访问数据库 我理解这个理论 但是说我有复杂的存储过程 这是业务领域操作的一部分 我想为与业务操作相关的代码编写一组单元测试 但是如果我模拟数据库 我会感觉我没有 真正 测试属于操作的所有部分 例如 有人可能
  • 从另一个应用程序以编程方式提交并终止 Spark 应用程序

    我想知道是否可以submit monitor kill从另一个服务激发应用程序 我的要求如下 我写了一个服务 parse用户命令 翻译他们变成可以理解的论据 to an 已经准备好的 Spark SQL 应用程序 使用以下命令将应用程序连同
  • Crockford 原型继承的小缺点

    只是在 JS 中尝试不同的继承技术 并发现 Crockford 的原型继承模式有些令人不安的地方 function object o function F F prototype o return new F var C P foo bar
  • 如何为 Python 迭代器编写分页器?

    我正在寻找一种 翻阅 Python 迭代器的方法 也就是说 我想包装给定的迭代器iter and 页面大小使用另一个迭代器 它将从 iter 返回项目作为一系列 页面 每个页面本身就是一个迭代器 最多可达页面大小迭代 我翻阅了迭代工具我看到
  • 在“选择前 n”查询中返回未锁定的行

    我需要有一个 MsSql 数据库表和另外 8 个 相同的 进程并行访问同一个表 选择前 n 行 处理这 n 行 并更新这些行的列 问题是我只需要选择并处理每一行一次 这意味着 如果一个进程访问数据库并选择了前 n 行 那么当第二个进程到来时