假设我们有一个 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 = ?
其中 ?
是一个参数。是否有可能在比赛中两个项目会尝试设置相同的重量?或者该数据库引擎是否特定?
最佳答案
是的,由于竞争条件,您可以获得两个相同的权重值。切换到ISOLATION LEVEL SERIALIZABLE
以避免这种情况(您可能会遇到死锁,但您可以重试。不过,您可以避免任何数据损坏)。或者采用 RDBMS 特定的适当悲观锁定。
关于sql - 此查询竞争条件是否免费?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13605874/