我们在 Google 管理的云数据库中的 Postgres 9.6.10 中运行此查询:
WITH update AS
(UPDATE cart SET loyalty = loyalty || jsonb_insert('{}', '{coupon}', loyalty#>'{scan_coupon}' || $1) WHERE id =
(SELECT id FROM cart WHERE id = $2 AND status = $3 and item_version = $4 FOR UPDATE) returning *)
SELECT * FROM updated
cart
是一个id
作为主键的表。loyalty
是一个 jsonb 列,item_version
是一个在某些操作上递增的函数,但预计在更新之前会发生几次item_version
更新。status
是枚举类型。
在高并发更新下,我们很少会遇到以下错误:
Cardinality_violation, file: "nodeSubplan.c", line: "1127", message: "more than one row returned by a subquery used as an expression", pg_code: "21000", routine: "ExecSetParamPlan", severity: "ERROR", unknown: "ERROR"
我已经确认它$2
实际上是一个整数并指向一个现有的行,因为id
它是主键,所以我看不出它怎么会返回超过一行。
这是有问题SELECT FOR UPDATE
的查询吗?id
如果是主键,该查询如何返回多行。