You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决数据库表行的并行数据修改冲突问题?

解决并发更新丢失(Lost Update)问题

你遇到的是典型的并发更新丢失场景:两个用户读取同一份数据后各自修改,后提交的操作直接覆盖了先提交的修改结果。下面是几种落地性强的解决办法:

  • 乐观锁方案(推荐高并发场景)
    在数据表中新增一个版本字段(比如version,整数类型)或时间戳字段(比如last_modified):

    1. 读取数据时,同时获取当前的版本号/时间戳
    2. 更新数据时,带上版本校验条件执行SQL:
      UPDATE your_table SET content = ?, version = version + 1 WHERE id = ? AND version = ?
      
    3. 检查SQL执行后的影响行数,如果是0,说明数据已经被其他用户修改,直接提示用户「数据已更新,请刷新后重新编辑」
  • 悲观锁方案(适合低并发、强一致性场景)
    读取数据时直接加行级锁,阻塞其他用户的读写操作直到当前事务完成:

    1. 在事务中使用带锁的查询语句,比如MySQL的SELECT ... FOR UPDATE:
      SELECT * FROM your_table WHERE id = ? FOR UPDATE;
      
    2. 修改数据后提交事务释放锁,其他用户才能继续操作该条数据
  • 原子更新操作(适合简单修改逻辑)
    如果修改逻辑可以直接在数据库层面完成,跳过「读-改-写」的流程,直接用原子性的SQL语句。比如要给某个数值加1,不用先读再算,直接执行:

    UPDATE your_table SET num = num + 1 WHERE id = ?;
    

    数据库会保证这个操作的原子性,不会出现更新丢失

  • 调整事务隔离级别(辅助方案)
    将数据库事务隔离级别设置为可重复读(Repeatable Read)或串行化(Serializable):

    • 可重复读是InnoDB的默认级别,通过MVCC机制避免了部分并发问题,但单独使用仍无法完全杜绝更新丢失,建议配合锁方案使用
    • 串行化会强制事务串行执行,完全避免并发问题,但会严重降低系统性能,仅适合极端场景

内容的提问来源于stack exchange,提问作者user20478727

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:32:47