use*_*692 6 postgresql select for-loop
我需要将记录的处理分发到不同的机器上。
在每台机器(节点)上,我每分钟运行以下查询:
select *
from RECORDS_TO_PROCESS
limit MAX_PER_MACHINE_RUN
for update
Run Code Online (Sandbox Code Playgroud)
假设我有 1000 条记录要处理,10 台机器(节点),每台机器希望在一分钟内处理 100 条记录(最多)。
R1
R2
R3
...
R101
R102
R103
...
R201
R202
R203
...
Run Code Online (Sandbox Code Playgroud)
我想要的只是让记录(R1-100)获取从节点1进行的查询,记录(R101-R200)从节点2进行的查询返回,等等。
这行得通吗?我们认为这能够分散负载吗?
假设事务隔离级别为默认级别(Read Comlated)
这是行不通的,因为第一个锁定行进行更新的查询将阻止所有尝试锁定同一行的后续查询,直到第一个查询提交。9.5版本将引入SKIP LOCKED这样它们就不会互相阻塞,而是都得到不同的行。
在 9.5 发布之前,您可以pg_try_advisory_lock在 WHERE 子句中使用来模拟该SKIP LOCKED功能。您必须安排每一行都有一个唯一的标识符来提供给pg_try_advisory_lock.
但我认为无论如何这是一个错误的设计。您几乎总是希望首先通过将一些标识符(例如节点+pid)写入列并提交来声明一行,然后执行第二个事务以在完成后将其标记为已完成。
如果您将其限制为每分钟 100 个,我认为没有理由尝试一次选择 100 个。一次只做一个,每半秒一次。开销应该是可以忍受的,除非您的数据库的 ping 时间非常长。
| 归档时间: |
|
| 查看次数: |
3414 次 |
| 最近记录: |