假设我们有一个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 = ?
其中?
是一个参数。是否有可能在比赛中有两件物品试图设定相同的重量?或者该数据库引擎是否具体?
答案 0 :(得分:2)
是的,由于比赛条件,您可以获得两个相同的重量值。切换到ISOLATION LEVEL SERIALIZABLE
以避免这种情况(您可能会遇到死锁,而您可以重试。但您可以避免任何数据损坏)。或者采用RDBMS特定的适当悲观锁定。
答案 1 :(得分:0)
如果两个交易并行执行,则可能。
两个事务都将为MAX(weight)+1
获取相同的值,然后尝试使用此相同值进行更新,从而导致违反约束。