我在 SQL 数据库(目前是 MS SQL Server)中实现了一个传入消息队列,可通过 Web 服务访问。此 Web 服务运行我们无法控制的遗留协议(protocol),并且必须返回“队列中没有消息”响应,或两者都返回:
- 队列中最早消息的详细信息
- 队列中其他消息的数量
用于此的算法目前非常粗糙:
- 选择队列中的所有消息
- 剩余消息数 = 行数 - 1
- 更新最早的消息以设置收集标志
我们正在转向一个现在可以并发访问的场景,并且显然遇到了同一条消息被拾取两次的并发问题。
我们遇到的问题是我们需要一个具有最低部署要求的可移植解决方案。理想情况下,这意味着没有存储过程,也没有特定于引擎的锁。
有没有人有什么好主意?
谢谢!
最佳答案
既然您已经在使用 SQL 服务器,您应该考虑使用 SQL Server Service Broker .
然而,这将您与 SQL Server 联系在一起......
您可能会考虑的一件事是选择...获取 ROW ID ...更新 ROW 以使用您生成的新 rowID(guid 等)将其标记为已收集...再次选择它...如果行 ID 是您设置的那个,那么您就是得到它的人...如果没有人在您之前进入,您必须去获得另一个。
基本上您是在自己实现脏读保护...因为您不想使用事务或存储过程...
关于mysql - 数据库队列的并发问题,需要可移植的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5546522/