我们正试图在不同的机器上构建一个具有多个服务实例的系统,这些实例共享处理负载。
每一个都会检查一个表,如果该表上有要处理的行,它会选择第一个,标记它正在处理,然后处理它,然后标记它已经完成。重复冲洗。
在两个实例a和B执行以下的情况下,防止比赛状态的最佳方法是什么
A(1)读取该表,找到要处理的行1,B(1)读取该表、找到要处理的行1,A(2)标记行处理B(2)标记行处理
在一个应用程序中,我们可以使用锁或互斥锁。
我可以把A1和A2放在一个事务中,是这么简单,还是有更好、更快的方法?
我应该直接打开它的头,这样步骤是:
A(1)将下一行标记为我要处理的行A(2)将其退还给我进行处理。
我想这个问题以前已经解决过很多次了,所以我正在寻找"标准"的解决方案,如果有不止一个,那就是优点和缺点。
事务是一个很好的简单答案,有两个可能的缺点:
1) 您可能需要查看数据库的详细信息。有时,默认的一致性设置并不能保证在所有可能的情况下都具有绝对的一致性。
2) 有时,与使用数据库排队和分配工作相关的访问模式对一个没有预料到的数据库来说是困难的
一种可能性是寻找可靠的消息队列系统,它似乎与您所寻找的非常匹配——工作机器可以从共享队列中读取工作。可能的起点是http://en.wikipedia.org/wiki/Message_queue和http://docs.oracle.com/cd/B10500_01/appdev.920/a96587/qintro.htm