繁体   English   中英

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

[英]How to read only those records which have no lock on them?

我有一个表,我从中选择特定记录并更新它们。现在我想运行两个单独的程序来完成这项工作。
该表是submission ,其存储竞赛的程序提交。它具有最初Queued的属性status ,并且稍后改为Wrong AnswerAccepted等。因此,我的程序读取状态为已Queued那些记录并对其进行评估。

现在如果我在两个独立的终端上运行这个程序,请说program_1 and program_2 如果program_1读取具有Queued状态的记录,那么我不希望program_2读取它,因为它将意味着重新评估提交。这违背了我的并行评估目的。如果我锁定program_1读取的记录它将解决问题。然后program_2可能必须等待锁定被释放,即使program_1正在评估提交,并且在它释放后锁定program_2与此提交无关,因为它的状态将是Queued其他内容,因为它将由program_1进行评估。这再次以某种方式破坏了并行评估的目的。
我该如何解决这个问题?

如果你有兴趣在整整两个方案的解决方案,你怎么样,仅仅通过它的主键排序表,并有program_1从列表的顶部开始, program_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可能会死亡,那么您需要某种方式让父进程检测到一个孩子已经死亡,查询其剩余工作负载,然后将该工作负载重新分配给另一个子进程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM