sql - 此查询竞争条件是否免费?

标签 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 = ?

其中 ? 是一个参数。是否有可能在比赛中两个项目会尝试设置相同的重量?或者该数据库引擎是否特定?

最佳答案

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

关于sql - 此查询竞争条件是否免费?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13605874/

相关文章:

Java:与垃圾收集器赛跑

sql - 显示与另一个表 sql server 不匹配的空值

python - 在 Django 登录中检索自定义 SQL 条目

sql - 使用 rpad 填充 Postgresql 中的字符串而不截断它

c# - 将sql返回保存在一个字符串中

sql - 用于测试的 Oracle 虚拟更新(任何 DML)命令

java - SequentialTransition 重复次数超过循环次数

multithreading - 为什么在多线程Scala中出现竞争状况?

node.js - 针对竞争条件的 Mongoose 自定义验证功能

php - 当我尝试有条件地插入或更新时,我在我的 Laravel 应用程序中遇到了竞争条件,有什么建议......?