问题描述
文件: 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
问题
- 无操作也递增: 即使
nodes=None 且 status=None,version 也会 +1。
- 无乐观锁检查: 没有
WHERE version = ? 条件,两个并发请求读到 version=N,都写入 N+1,后写覆盖先写(last-write-wins)。
- 前端未发送 version: 前端 PATCH 请求不携带 version 字段,后端校验形同虚设。
建议修复
- 仅在数据变更时递增 version。
- 加入乐观锁:
UPDATE ... SET version = version + 1 WHERE id = ? AND version = ?,检查 affected rows。
- 前端配合: PATCH 请求携带当前 version,后端校验不匹配时返回 409 Conflict。
影响
- 严重程度: Medium
- 并发编辑场景下数据静默丢失
问题描述
文件:
backend/packages/app/src/windup_app/server/workflow_run/service.py:70-87问题
nodes=None且status=None,version 也会 +1。WHERE version = ?条件,两个并发请求读到 version=N,都写入 N+1,后写覆盖先写(last-write-wins)。建议修复
UPDATE ... SET version = version + 1 WHERE id = ? AND version = ?,检查 affected rows。影响