![]() |
1
59
我建议你过去
Using tables as Queues
.
正确实现的队列可以处理数千个并发用户和高达每分钟1/2百万的入/出队列操作的服务。在SQLServer2005之前,这个解决方案很麻烦,而且涉及到
1) 你需要自动出列。您必须找到该行,跳过所有锁定的行,并在单个原子操作中将其标记为“dequeued”,这就是
2) 你呢
必须
使用表上最左边的聚集索引键构造表
3) 您不能通过任何其他方式查询此表,只能通过出列。尝试执行Peek操作或尝试同时将表用作队列 和 很有可能 导致死锁,并将显著降低吞吐量。 原子出列、搜索要出列的元素的readpass提示和基于处理位的聚集索引上最左边的键的组合确保了在高并发负载下非常高的吞吐量。 |
![]() |
2
8
我的答案告诉你如何使用表作为队列。。。 SQL Server Process Queue Race Condition 你基本上需要“ROWLOCK,readpass,UPDLOCK”提示 |
![]() |
3
1
如果要序列化多个客户机的操作,只需使用应用程序锁即可。
|
![]() |
4
0
您可以使用int来定义命令的状态,而不是使用布尔值来处理:
|
![]() |
5
0
可能更好的选择是使用trisSate处理列和version/timestamp列。然后,processed列中的三个值将指示行是正在处理、已处理还是未处理。
您可能还需要添加一个客户机标识符,这样,如果客户机在处理它时死亡,它就可以重新启动,查看最后一行,然后从它所在的位置开始。 |
![]() |
6
0
我不想乱动桌子上的锁。只需创建两个额外的列,如IsProcessing(位/布尔值)和ProcessingStarted(日期时间)。当一个worker崩溃或者在超时后没有更新他的行时,您可以让另一个worker尝试处理数据。 |
![]() |
7
0
一种方法是使用单个update语句标记行。如果您在
它使用
|
![]() |
Duvan · 将逗号(,)替换为点(.)[副本] 2 年前 |
![]() |
Mateen Bagheri · 选择表的计数并选择其自身 2 年前 |
![]() |
SoT · SQL Server中求和函数的工作方式 2 年前 |
![]() |
NKAT · 将列值聚合到列表中会产生错误 2 年前 |
![]() |
deanpillow · 返回两列中有一个匹配值的记录 2 年前 |
![]() |
snowflakes74 · 在Dapper中异步查询多个结果 2 年前 |