代码之家  ›  专栏  ›  技术社区  ›  sdgfsdh

防止Postgres中的冲突更新

  •  2
  • sdgfsdh  · 技术社区  · 6 年前

    "users" 带有 "state" 列,即 jsonb

    我有 倍数

    API将获取当前状态( SELECT updateState )然后更新数据库( UPDATE )结果如何。

    可能是这样的:

    const updateHandler = async (id) =>
      const { state } = await db.one(
        `SELECT * FROM users WHERE id = $<id> LIMIT 1`, 
        { id });
    
      const nextState = updateState(state);
    
      await db.query(
        `UPDATE users SET state = $<nextState> WHERE id = $<id>`, 
        { id, nextState });
    });
    

    因为我有多个服务器,所以我想确保当状态更新时,它是调用 更新不动产 state 已经存在的值。如果其他服务器已经在执行更新,则每个服务器都应该排队(或者抛出错误)。

    这样做的最佳策略是什么?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Indent    6 年前

    使用 Optimistic Locking Pattern

    UPDATE users
    SET    state = $<nextState>
    WHERE  id = $<id> and state=$<currentState>
    

    检查nb行更新以检测冲突:

    • 1行=>没关系
    • 0行=>您有冲突(另一个进程有冲突) 已更新相同的id数据)