2

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

?论据在哪里。是否有可能由于比赛两个项目会尝试设置相同的重量?还是该数据库引擎是特定的?

4

2 回答 2

2

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

于 2012-11-28T13:16:29.890 回答
0

如果两个事务并行执行,这是可能的。

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

于 2012-11-28T13:14:35.210 回答