如何解决数据库表行的并行数据修改冲突问题?
解决并发更新丢失(Lost Update)问题
你遇到的是典型的并发更新丢失场景:两个用户读取同一份数据后各自修改,后提交的操作直接覆盖了先提交的修改结果。下面是几种落地性强的解决办法:
乐观锁方案(推荐高并发场景)
在数据表中新增一个版本字段(比如version,整数类型)或时间戳字段(比如last_modified):- 读取数据时,同时获取当前的版本号/时间戳
- 更新数据时,带上版本校验条件执行SQL:
UPDATE your_table SET content = ?, version = version + 1 WHERE id = ? AND version = ? - 检查SQL执行后的影响行数,如果是0,说明数据已经被其他用户修改,直接提示用户「数据已更新,请刷新后重新编辑」
悲观锁方案(适合低并发、强一致性场景)
读取数据时直接加行级锁,阻塞其他用户的读写操作直到当前事务完成:- 在事务中使用带锁的查询语句,比如MySQL的
SELECT ... FOR UPDATE:SELECT * FROM your_table WHERE id = ? FOR UPDATE; - 修改数据后提交事务释放锁,其他用户才能继续操作该条数据
- 在事务中使用带锁的查询语句,比如MySQL的
原子更新操作(适合简单修改逻辑)
如果修改逻辑可以直接在数据库层面完成,跳过「读-改-写」的流程,直接用原子性的SQL语句。比如要给某个数值加1,不用先读再算,直接执行:UPDATE your_table SET num = num + 1 WHERE id = ?;数据库会保证这个操作的原子性,不会出现更新丢失
调整事务隔离级别(辅助方案)
将数据库事务隔离级别设置为可重复读(Repeatable Read)或串行化(Serializable):- 可重复读是InnoDB的默认级别,通过MVCC机制避免了部分并发问题,但单独使用仍无法完全杜绝更新丢失,建议配合锁方案使用
- 串行化会强制事务串行执行,完全避免并发问题,但会严重降低系统性能,仅适合极端场景
内容的提问来源于stack exchange,提问作者user20478727
相关产品推荐
相关产品推荐

