【问题标题】:selecting different record for each user at the same time using MSSQL 2012使用 MSSQL 2012 同时为每个用户选择不同的记录
【发布时间】:2017-10-31 11:05:11
【问题描述】:

我的 Web 应用程序在获取下一条记录的同时有大约 300 个用户我想向他们显示记录,以便每个用户都有不同的记录(即它们之间不重复)

而且提取的记录也希望将它们标记为已提取,因此在下一个提取批次中不应考虑。

我不知道下面的查询是否适合我。

SELECT TOP 1 * FROM [Table_name] ORDER BY NEWID();

【问题讨论】:

  • select top 1 * from MyTable where Fetched=0 order by newid() 防止出现已获取的记录。然后你必须将获取的记录标记为 fetched update myTable set Fetched=1
  • 谢谢回复,我会试试的
  • 显然对于更新,您需要指定您正在使用的记录的 id。目前这条语句会更新表中的所有记录为fetched=1

标签: sql sql-server-2012


【解决方案1】:

您不需要 ORDER BY 什么东西 - 只需使用 TOP 1 - SQL 引擎将自行按行排序(例如使用索引):

BEGIN TRAN;

DECLARE @TableId INT;

Select top 1 @TableId = TableId
from MyTable
where Fetched=0;

Update myTable 
set Fetched=1 
WHERE TableId = @TableId;

COMMIT TRAN;

SELECT *
FROM myTable
WHERE TableId = @TableId;

您可以将整个语句包装在事务中并检查数据库的isolation 级别 - 您也可以更改存储过程中的隔离级别。

【讨论】:

  • 更新时是否需要考虑“有锁或无锁”语句
  • 您可以将整个语句包装在事务中。
猜你喜欢
  • 1970-01-01
  • 2015-02-11
  • 2012-08-25
  • 1970-01-01
  • 2020-02-27
  • 2013-02-20
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多