Skip to content

fix(service): workflow_run 版本号无条件递增,缺乏真正的乐观锁 #203

Description

@xiaocheny214

问题描述

文件: backend/packages/app/src/windup_app/server/workflow_run/service.py:70-87

def update_run(self, session, run_id, *, nodes=None, status=None):
    run = session.get(WorkflowRun, run_id)
    if run is None:
        return None
    if nodes is not None:
        run.nodes = nodes
    if status is not None:
        run.status = status.value
    run.version += 1  # ← 无条件递增,即使什么都没改
    session.flush()
    return run

问题

  1. 无操作也递增: 即使 nodes=Nonestatus=None,version 也会 +1。
  2. 无乐观锁检查: 没有 WHERE version = ? 条件,两个并发请求读到 version=N,都写入 N+1,后写覆盖先写(last-write-wins)。
  3. 前端未发送 version: 前端 PATCH 请求不携带 version 字段,后端校验形同虚设。

建议修复

  1. 仅在数据变更时递增 version。
  2. 加入乐观锁: UPDATE ... SET version = version + 1 WHERE id = ? AND version = ?,检查 affected rows。
  3. 前端配合: PATCH 请求携带当前 version,后端校验不匹配时返回 409 Conflict。

影响

  • 严重程度: Medium
  • 并发编辑场景下数据静默丢失

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1优先级 P1(次级)bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions