我需要将对记录的处理分配到不同的机器。
在每台机器(节点)上,我每分钟运行一次以下查询:
select *
from RECORDS_TO_PROCESS
limit MAX_PER_MACHINE_RUN
for update
假设,假设我有 1000 条记录要处理,10 台机器(节点),每台机器想在一分钟内处理 100 条记录(最多)。
R1
R2
R3
...
R101
R102
R103
...
R201
R202
R203
...
我想要的只是让 Records (R1-100) 获取从 Node1 进行的查询,从 Node2 等进行的查询返回 Records (R101-R200)。
这行得通吗?我们认为这能够分散负载吗?
假设事务隔离级别是默认的(Read Committed)
最佳答案
那是行不通的,因为第一个锁定行以进行更新的查询将阻止所有试图锁定同一行的后续查询,直到第一个查询提交。 9.5 版将引入SKIP LOCKED
,这样它们就不会互相阻塞,而是都得到不同的行。
在 9.5 发布之前,您可以在 WHERE 子句中使用 pg_try_advisory_lock
来模拟 SKIP LOCKED
功能。您必须为每一行安排一个唯一的(ish)标识符以提供给 pg_try_advisory_lock
。
但我认为无论如何这是一个错误的设计。您几乎总是希望首先通过将一些标识符(如节点 + pid)写入列并提交来声明一行,然后在完成后执行第二个事务以将其标记为已完成。
如果您将其限制为每分钟 100 个,我认为没有理由尝试一次选择 100 个。一次只做一个,每半秒一次。除非您的数据库有非常高的 ping 时间,否则开销应该是可以容忍的。
关于postgresql - 在 Postgres 中使用限制选择更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33351277/