【问题标题】:SQL Get distinct record for each request [duplicate]SQL获取每个请求的不同记录[重复]
【发布时间】:2021-10-13 17:08:40
【问题描述】:

假设我的表中有 10 条记录。

  • ID 名称
  • 1 abc
  • 2 定义
  • 3 吉
  • 10 xyz

现在将有多个并发请求对该 SQL 表的多个请求,并从该表中选择前 1 条记录。

  • 当 First request 带有 Select TOP 1 记录时,应返回并锁定第一条记录以供其他人更新
  • 当第二个请求带有select TOP 1记录时,下一条记录应该被锁定并返回
  • 当第三个请求带有select TOP 1记录时,第3条记录应该被锁定并返回
  • 当第10个请求带有select TOP 1记录时,第10个记录应该被锁定并返回

有没有办法进行这种操作?

【问题讨论】:

  • 请求来自哪里?期待这样的答案:“10 个打开网页的用户运行一个 Angular 应用程序,该应用程序调用后端 C# Web 服务,该服务使用数据库”
  • 对我来说它看起来像队列实现。据我记得在 SQL Server 中,您可以使用提示 READPAST 来实现这一点
  • 照你说的做?锁表,拉第一条记录,设置为进行中,解锁表?
  • 感谢分享输入。我同时有一个 Web 应用程序和不同的用户或不同的浏览器会话请求号。我已经预先填充了 SQL 表中的数字。现在我的应用程序层应该从这个 SQL 表中获取唯一编号,而无需锁定整个表。如果我锁定表,它会起作用,但它会是连续的并影响性能。 10 只是我提到的示例,但实际上可能有数千个。类似于rusanu.com/2010/03/26/using-tables-as-queuesthis
  • SQL Server 2005 多年来一直不受支持 。如果您真的在使用该数据库,请升级!如果没有,请修复标签。

标签: sql sql-server tsql sql-server-2016


【解决方案1】:

我可能会建议向表中添加一个新列并使用output 子句。新列类似于processed_on。那么:

create table @ids (id int);

update top (1) t with (rowlock)
    set processed_on = getdate()
    output inserted.id into @ids
    where processed_on is null;

您希望在processed_on 上建立索引。我相信这只会锁定有问题的行。

那就去处理@ids吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2015-12-30
    • 1970-01-01
    相关资源
    最近更新 更多