我正在构建一个应用程序,它从 Posgtres 表中读取任务来执行计算。我的目标是在执行此类任务时达到并发性。
我有一个状态模型: 0 - 初始 1 - 进行中 2 - 完成 当任务计算事务开始时,进行以下转换:0 -> 1。为此,我当前正在使用以下查询:
with next_task as (select id
from tasks
where status = 0
limit 1 for update skip locked)
update tasks t
set status = 1
from next_task nt
where t.id = nt.id
returning t.id, t.type, t.bucket, t.params, t.message, t.attempts, t.status, t.created_at, t.updated_at
在运行相关事务时查询状态时,不会返回
status
字段。就我而言,需要监视任务状态原因(我需要知道当前正在运行哪个任务)。
在事务内运行查询时的当前行为:
...|status|...
...| 0 |...
期望的行为:
...|status|...
...| 1 |...
我该怎么做才能改变状态?我的想法是进行两笔交易 - 一笔用于获取
task
,另一笔用于执行计算。但这会不会违背交易原则?
但这会不会违背交易原则?
能够从交易外部监控交易也违背了交易原则。如果您需要这样做,那么您应该在两个单独的 PostgreSQL 事务中进行。一个用于声明元组,一个用于完成并放弃它。