Postgres SELECT FOR UPDATE,在事务运行时实际更新行

问题描述 投票:0回答:1

我正在构建一个应用程序,它从 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
,另一笔用于执行计算。但这会不会违背交易原则?

sql postgresql transactions
1个回答
0
投票

但这会不会违背交易原则?

能够从交易外部监控交易违背了交易原则。如果您需要这样做,那么您应该在两个单独的 PostgreSQL 事务中进行。一个用于声明元组,一个用于完成并放弃它。

© www.soinside.com 2019 - 2024. All rights reserved.