我们正在尝试在共享处理负载的不同计算机上构建一个具有多个服务实例的系统。
每个都会检查一个表,如果在该表上有待处理的行,它将选择第一个,标记它处理,然后处理它,然后标记完成。冲洗重复。
防止比赛情况的最佳方法是什么,其中2个实例A和B执行以下操作
A(1)读取表格,找到要处理的第1行, B(1)读取表,找到要处理的第1行, A(2)标记它行处理 B(2)标记行处理
在单个应用中,我们可以使用锁或互斥锁。
我可以把A1和A2放在一个交易中,是这么简单,还是有更好,更快的方法呢?
我应该把它打开,以便步骤为:
A(1)将下一行标记为我要处理的行 A(2)退回给我处理。
我认为这之前必须多次解决,所以我正在寻找"标准"解决方案,如果有多个优点和缺点。
答案 0 :(得分:0)
交易很简单,有两个可能的缺点:
1)您可能想要检查数据库的细则。有时,默认一致性设置并不能保证在每种可能情况下都保持绝对一致性。
2)有时,与使用数据库排队和分发工作相关的访问模式对于不期望它的数据库来说很难。
一种可能性是查看可靠的消息排队系统,这些系统似乎与您正在寻找的内容非常匹配 - 工作者计算机只能从共享队列中读取工作。可能的起点是http://en.wikipedia.org/wiki/Message_queue和http://docs.oracle.com/cd/B10500_01/appdev.920/a96587/qintro.htm