如何只读取那些没有锁定的记录?

时间:2013-06-24 13:55:47

标签: mysql database

我有一张表,我从中选择特定记录并更新它们。现在我想运行两个独立的程序来完成这项工作。
该表格为submission,用于存储比赛的节目提交。它有一个 属性status最初为Queued,后来更改为Wrong AnswerAccepted等。因此我的程序会读取状态为Queued的记录并对其进行评估。

现在,如果我在两个单独的终端上运行此程序,请说program_1 and program_2。如果program_1读取状态为Queued的记录,那么我不希望program_2读取它,因为这将意味着重新评估提交。这违背了我的并行评估目的。如果我对program_1所读取的记录进行锁定,则会解决问题。但是program_2可能必须等待即使program_1发布锁定也是如此 正在评估提交,并在发布锁定后program_2与此提交无关,因为它的状态将来自Queued,因为它已由program_1进行评估。以某种方式违背并行评价的目的 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果您只对解决方案中的 感兴趣的是两个程序,那么您只需按主键对表进行排序,并从列表顶部开始program_1program_2从底部开始?这将您的重复工作限制在最多一条记录(两个程序的努力“在中间”相遇“)。如果一个程序仅在几个记录之后死亡,另一个程序将能够完成工作。

(当然,如果一个程序仅在几个记录之后就死了,那么很可能会有一个严重的错误,其他程序很快就会死掉。)

FWIW,我建议不要尝试这样做。让两个进程争夺无差别的工作负载绝不是一个好主意。如果要加快处理速度,请在一个线程上执行查询,然后在其他几个线程中明确拆分工作。 (您可以通过分配新进程而不是生成新线程来执行相同的方法;或者甚至通过将RPC发送到其他物理机器;但真的对我来说似乎有些过分。)

即,而不是

L = result_of_SQL_query();
worker1.process(L) & worker2.process(L);

你应该做的

L = result_of_SQL_query();
L1 = first_half_of(L);
L2 = second_half_of(L);
worker1.process(L1) & worker2.process(L2);

如果您担心worker1可能会死亡,那么您需要一些方法让父进程检测到一个孩子已经死亡,查询其剩余工作负载,然后将该工作负载重新分配给另一个孩子

相关问题