此查询竞争条件是免费的吗?

时间:2012-11-28 13:12:58

标签: sql race-condition

假设我们有一个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 = ?

其中?是一个参数。是否有可能在比赛中有两件物品试图设定相同的重量?或者该数据库引擎是否具体?

2 个答案:

答案 0 :(得分:2)

是的,由于比赛条件,您可以获得两个相同的重量值。切换到ISOLATION LEVEL SERIALIZABLE以避免这种情况(您可能会遇到死锁,而您可以重试。但您可以避免任何数据损坏)。或者采用RDBMS特定的适当悲观锁定。

答案 1 :(得分:0)

如果两个交易并行执行,则可能。

两个事务都将为MAX(weight)+1获取相同的值,然后尝试使用此相同值进行更新,从而导致违反约束。