mysql - 数据库队列的并发问题,需要可移植的解决方案

标签 mysql sql-server concurrency locking thread-safety

我在 SQL 数据库(目前是 MS SQL Server)中实现了一个传入消息队列,可通过 Web 服务访问。此 Web 服务运行我们无法控制的遗留协议(protocol),并且必须返回“队列中没有消息”响应,或两者都返回:

  • 队列中最早消息的详细信息
  • 队列中其他消息的数量

用于此的算法目前非常粗糙:

  1. 选择队列中的所有消息
  2. 剩余消息数 = 行数 - 1
  3. 更新最早的消息以设置收集标志

我们正在转向一个现在可以并发访问的场景,并且显然遇到了同一条消息被拾取两次的并发问题。

我们遇到的问题是我们需要一个具有最低部署要求可移植解决方案。理想情况下,这意味着没有存储过程,也没有特定于引擎的锁。

有没有人有什么好主意?

谢谢!

最佳答案

既然您已经在使用 SQL 服务器,您应该考虑使用 SQL Server Service Broker .

然而,这将您与 SQL Server 联系在一起......

您可能会考虑的一件事是选择...获取 ROW ID ...更新 ROW 以使用您生成的新 rowID(guid 等)将其标记为已收集...再次选择它...如果行 ID 是您设置的那个,那么您就是得到它的人...如果没有人在您之前进入,您必须去获得另一个。

基本上您是在自己实现脏读保护...因为您不想使用事务或存储过程...

关于mysql - 数据库队列的并发问题,需要可移植的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5546522/

相关文章:

mysql - Golang MySQL 错误 - packets.go :33: unexpected EOF

php - WampServer v2.5 上线403错误禁止访问

sql-server - 将 xml 字符串参数传递给 SQL Server 存储过程

sql-server - 如何在 SQL Server 2005/2008 中查找过程(或函数)的所有实例

sockets - 操作系统如何在接受同一个套接字的多个进程之间进行负载平衡?

php - 优化 jQuery 速度

MySQL 使用部分字符串进行搜索

sql - 具有 2 个联合的公用表表达式计数器

java - 与并发共享变量

java - Java中轮询时的Thread.sleep或yield