防止 Postgres 中的更新冲突



我有一个"users"表,其中"state"jsonb.更新此状态的逻辑很复杂,并且是用"真正的"编程语言(例如JavaScript(实现的。

有多个服务器提供用于更新状态的 API。这些服务器之间的负载平衡是不确定的,因此更新请求可能并不总是发送到同一服务器。

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值调用updateState的结果。如果另一台服务器已经在执行更新,则每个服务器都应该排队(或者可能引发错误(。

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

使用Optimistic Locking Pattern时,您只需检查当前状态即可验证您的交易

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

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

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

最新更新