防止 Postgres 中的更新冲突
Preventing conflicting updates in Postgres
我有一个 "users"
table,其中 "state"
列是 jsonb
。更新此状态的逻辑很复杂,并以 "true" 编程语言(例如 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 数据)
我有一个 "users"
table,其中 "state"
列是 jsonb
。更新此状态的逻辑很复杂,并以 "true" 编程语言(例如 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 数据)