假设我们有一个t1
表,其中整数weight
列被标记为唯一,item_id
是主键。以下查询可以失败吗?这个查询竞赛条件是免费的吗?
UPDATE t1
SET weight = SELECT new_weight FROM (
SELECT MAX(weight) + 1 AS new_weight FROM t1
) qs
WHERE item_id = ?
其中?
是一个参数。有可能是因为一场比赛两项物品会试图设定相同的重量?或者那个数据库引擎是特定的?
这取决于数据库引擎以及正在使用的隔离级别(如果适用)。 –
如果您的数据库管理系统支持序列,自动编号或标识列,则应该使用它们。否则,您为多个用户唯一安全的选择就是序列化对表的访问权限,即为您的交易锁定表。 –